Wie würden Sie diese PHP-switch-Anweisung ausführen?
Beachten Sie auch, dass dies viel kleinere Versionen sind. Der 1, die ich erstellen muss, werden viel mehr Werte hinzugefügt.
Version 1:
switch ($p) {
case 'home':
case '':
$current_home = 'current';
break;
case 'users.online':
case 'users.location':
case 'users.featured':
case 'users.new':
case 'users.browse':
case 'users.search':
case 'users.staff':
$current_users = 'current';
break;
case 'forum':
$current_forum = 'current';
break;
}
Version 2:
switch ($p) {
case 'home':
$current_home = 'current';
break;
case 'users.online' || 'users.location' || 'users.featured' || 'users.browse' || 'users.search' || 'users.staff':
$current_users = 'current';
break;
case 'forum':
$current_forum = 'current';
break;
}
UPDATE - Testergebnisse
Ich habe einen Geschwindigkeitstest mit 10.000 Iterationen durchgeführt.
Time1: 0.0199389457703 // If-Anweisungen
Time2: 0.0389049446106 // switch-Anweisungen
Time3: 0.106977939606 // Arrays
php
switch-statement
JasonDavis
quelle
quelle
Antworten:
In jeder Situation, in der Sie eine unbekannte Zeichenfolge haben und herausfinden müssen, zu welcher einer Reihe anderer Zeichenfolgen sie passt, besteht die einzige Lösung, die nicht langsamer wird, wenn Sie weitere Elemente hinzufügen, darin, ein Array zu verwenden, aber alle zu haben die möglichen Zeichenfolgen als Schlüssel. So kann Ihr Schalter durch Folgendes ersetzt werden:
// used for $current_home = 'current'; $group1 = array( 'home' => True, ); // used for $current_users = 'current'; $group2 = array( 'users.online' => True, 'users.location' => True, 'users.featured' => True, 'users.new' => True, 'users.browse' => True, 'users.search' => True, 'users.staff' => True, ); // used for $current_forum = 'current'; $group3 = array( 'forum' => True, ); if(isset($group1[$p])) $current_home = 'current'; else if(isset($group2[$p])) $current_users = 'current'; else if(isset($group3[$p])) $current_forum = 'current'; else user_error("\$p is invalid", E_USER_ERROR);
Dies sieht nicht so sauber aus wie eine
switch()
, aber es ist die einzige schnelle Lösung, bei der keine kleine Bibliothek mit Funktionen und Klassen geschrieben wird, um Ordnung zu schaffen. Es ist immer noch sehr einfach, Elemente zu den Arrays hinzuzufügen.quelle
Version 2 funktioniert nicht !!
case 'users.online' || 'users.location' || ...
ist genau das gleiche wie:
case True:
und das
case
wird für jeden Wert von gewählt$p
, es$p
sei denn, es ist die leere Zeichenfolge.||
Hat keine besondere Bedeutung in einercase
Anweisung, Sie vergleichen nicht$p
mit jeder dieser Zeichenfolgen, Sie überprüfen nur, ob dies nicht der Fall istFalse
.quelle
Fügen Sie diese vielen Werte in ein Array ein und fragen Sie das Array ab, da der Switch-Fall die zugrunde liegende Semantik dessen zu verbergen scheint, was Sie erreichen möchten, wenn eine Zeichenfolgenvariable als Bedingung verwendet wird, was das Lesen und Verstehen erschwert, z ::
$current_home = null; $current_users = null; $current_forum = null; $lotsOfStrings = array('users.online', 'users.location', 'users.featured', 'users.new'); if(empty($p)) { $current_home = 'current'; } if(in_array($p,$lotsOfStrings)) { $current_users = 'current'; } if(0 === strcmp('forum',$p)) { $current_forum = 'current'; }
quelle
Aus Gründen der Vollständigkeit, werde ich darauf hinweisen, dass die gebrochene „Version 2“ Logik kann das Arbeiten mit einer switch - Anweisung ersetzt werden, und auch die Verwendung von Arrays für Geschwindigkeit und Klarheit, wie so machen:
quelle
Wenn irgendjemand Ihren Code jemals pflegen würde, würde er Version 2 mit ziemlicher Sicherheit doppelt übernehmen - das ist extrem unüblich.
Ich würde bei Version 1 bleiben. Ich bin von der Schule, obwohl diese Fallaussagen ohne eigenen Anweisungsblock einen expliziten
// fall through
Kommentar neben sich haben sollten, um anzuzeigen, dass es tatsächlich Ihre Absicht ist, durchzufallen, wodurch jegliche Unklarheit darüber beseitigt wird, ob Sie wollten die Fälle anders behandeln und vergessen oder so.quelle
Einige andere Ideen, die noch nicht erwähnt wurden:
switch(true){ case in_array($p, array('home', '')): $current_home = 'current'; break; case preg_match('/^users\.(online|location|featured|new|browse|search|staff)$/', $p): $current_users = 'current'; break; case 'forum' == $p: $current_forum = 'current'; break; }
Jemand wird sich wahrscheinlich über Lesbarkeitsprobleme mit # 2 beschweren, aber ich hätte kein Problem damit, solchen Code zu erben.
quelle
Version 1 ist sicherlich augenschonender, klarer in Bezug auf Ihre Absichten und einfacher, Fallbedingungen hinzuzufügen.
Ich habe die zweite Version noch nie ausprobiert. In vielen Sprachen würde dies nicht einmal kompiliert werden, da die einzelnen Fallbezeichnungen zu einem konstanten Ausdruck ausgewertet werden müssen.
quelle
Heutzutage können Sie tun ...
switch ([$group1, $group2]){ case ["users", "location"]: case ["users", "online"]: Ju_le_do_the_thing(); break; case ["forum", $group2]: Foo_the_bar(); break; }
quelle
Ich bevorzuge definitiv Version 1. Version 2 erfordert möglicherweise weniger Codezeilen, aber es wird extrem schwer zu lesen sein, wenn Sie viele Werte darin haben, wie Sie es vorhersagen.
(Ehrlich gesagt wusste ich bis jetzt nicht einmal, dass Version 2 legal ist. Ich habe es noch nie so gesehen.)
quelle
Keine Version 2 funktioniert tatsächlich nicht, aber wenn Sie diese Art von Ansatz wünschen, können Sie Folgendes tun (wahrscheinlich nicht die schnellste, aber wohl intuitivere):
switch (true) {
case ($var === 'something' || $var === 'something else'):
// do some stuff
break;
}
quelle
if
Aussage ersetzt werden.könnte sein
switch ($variable) { case 0: exit; break; case (1 || 3 || 4 || 5 || 6): die(var_dump('expression')); default: die(var_dump('default')); # code... break; }
quelle
Ich denke, Version 1 ist der richtige Weg. Es ist viel einfacher zu lesen und zu verstehen.
quelle
if( in_array( $test, $array1 ) ) { // do this } else if( stristr( $test, 'commonpart' ) ) { // do this } else { switch( $test ) { case 1: // do this break; case 2: // do this break; default: // do this break; } }
quelle
Ein Wechsel in Kombination mit variablen Variablen bietet Ihnen mehr Flexibilität:
<?php $p = 'home'; //For testing $p = ( strpos($p, 'users') !== false? 'users': $p); switch ($p) { default: $varContainer = 'current_' . $p; //Stores the variable [$current_"xyORz"] into $varContainer ${$varContainer} = 'current'; //Sets the VALUE of [$current_"xyORz"] to 'current' break; } //For testing echo $current_home; ?>
Um mehr zu erfahren, überprüfen Sie die Variablenvariablen und die Beispiele, die ich im PHP-Handbuch eingereicht habe:
Beispiel 1 : http://www.php.net/manual/en/language.variables.variable.php#105293
Beispiel 2 : http: // www .php.net / manual / de / language.variables.variable.php # 105282
PS: Dieser Beispielcode ist KLEIN UND EINFACH , genau so, wie ich es mag. Es ist getestet und funktioniert auch
quelle
case
Bedingungen am effizientesten kombiniert werden können.Sie suchen einfach nach allgemeinen Mustern in Zeichenfolgen. Ich hätte gedacht, ein regulärer Ausdruck wäre eine effizientere Möglichkeit, dies zu tun, da PHP dies mit preg_match implementiert, so wenig Code zum Schreiben und wahrscheinlich massiv schneller. Zum Beispiel:
case preg_match('/^users./'): // do something here break;
quelle