
Jessie Stiel
Ich habe vier Bedingungen, die ich durchlaufen muss, und ich dachte, es wäre am besten, die zu verwenden switch
Anweisung in PHP. Ich muss jedoch prüfen, ob eine ganze Zahl beispielsweise kleiner oder gleich oder größer und gleich ist.
switch ($count) {
case 20:
$priority = 'low';
break;
case 40:
$priority = 'medium';
break;
case 60:
$priority = 'high';
break;
case 80:
$priority = 'severe';
break;
}
Mit einem if()
Anweisung würde es wie folgt aussehen:
if ($count <= 20) {
$priority = 'low';
} elseif ($count <= 40) {
$priority = 'medium';
} elseif ($count <= 60) {
$priority = 'high';
} else {
$priority = 'severe';
}
Ist das drin möglich switch-case
?
Ein allgemeinerer Fall zur Lösung dieses Problems ist:
switch (true) {
case $count <= 20:
$priority = 'low';
break;
case $count <= 40:
$priority = 'medium';
break;
case $count <= 60:
$priority = 'high';
break;
default:
$priority = 'severe';
break;
}
Schalter können das nicht, aber in diesem speziellen Fall können Sie so etwas tun:
switch ((int)(($count - 1) / 20)) {
case 0:
$priority = 'low';
break;
case 1:
$priority = 'medium';
break;
case 2:
$priority = 'high';
break;
case 3:
$priority = 'severe';
break;
}
Also rein (int)(($count - 1) / 20)
alle Werte von 0 bis 20 ergeben 0, 21 bis 40 ergeben 1 und so weiter, sodass Sie für diesen Zweck die switch-Anweisung verwenden können.
Und da wir Werte verketten, können wir sogar zu einem Array vereinfachen:
$priorities = ['low', 'medium', 'high', 'severe'];
$priority = $priorities[(int)(($count - 1) / 20)];

Bytephunk
Es gibt einen Weg, der in PHP 7 mit ternären Zuweisungsoperatoren funktioniert. Der Operator wurde früher eingeführt (5.4?), aber ich habe den Code nie auf anderen Versionen getestet. Ich habe den ganzen Schaltercode geschrieben dort, der Kürze halber ist hier jedoch nur die spezifische Klausel. Angenommen, wir möchten, dass die Bedingung für alle Zahlen größer oder gleich fünf gilt:
switch($value){
case ($value >= 5 ? $value : !$value): // Do something here
break;
}
Entweder lassen wir den $value unverändert passieren oder wir negieren den Wert entsprechend der Bedingung. Ein $-Wert wird immer mit sich selbst übereinstimmen oder den Test gegen seine Negation nicht bestehen.
Nein. switch()
Anweisungen sind für die Durchführung mehrerer Gleichheitstests. Sie sind im Grunde nur eine etwas einfacher zu lesende (aber auch gefährlichere) Version davon
if (x == 'a') { ... }
else if (x == 'b') { ... }
else if (x == 'c') { ... }
Code. Es gibt keine Möglichkeit, a zu ändern switch()
Weg von ==
zu <
oder irgendein anderer Vergleichsoperator. Es ist ausschließlich für Gleichheitstests.

Milchkeks
Verwendung der ternärer Operator:
$priority =
// "switch" comparison for $count
$count <= 20 ? 'low' :
($count <= 40 ? 'medium' :
($count <= 60 ? 'high' :
// default above 60
'severe'));
Ich kenne die allgemeine Beschwerde, dass ternäre Operatoren schwer zu verstehen sein können, aber das ist einfach zu einfach mit einem einfachen ?:
.
Es funktioniert wie die Excel „Wenn“-Formel:
=IF( logical_test, value_if_true, value_if_false )
$variable = logical_test ? value_if_true : value_if_false
Und Sie können die verschachteln Wenn Aussagen (setzen Sie eine zweite ?:
im ‘value_if_false’-Abschnitt des ersten), wo es sicherlich verwirrend werden kann, es zu lesen, aber weniger, wenn Sie es Zeile für Zeile schreiben, wie oben.
Mein obiger Code entspricht im Grunde dem if()
Aussage vom OP geschrieben.

Peter Mortensen
Ich kann auch bestätigen, dass die Antwort von bytepunk hier funktioniert.
Erweitern Sie das Konzept auch mit PHP 7:
switch ($interval->days)
{
case 0:
return '1 day';
// break;
case (($interval->days >= 1 && $interval->days <= 7) ?? $interval->days):
return '1 week';
// break;
case (($interval->days >= 8 && $interval->days <= 31) ?? $interval->days):
return '1 month';
// break;
case (($interval->days >= 31 && $interval->days <= 93) ?? $interval->days):
return '2-3 months';
// break;
default:
return '3+ months';
}
Ich gebe zu, dass dies nicht der sauberste Code ist, also würde es vielleicht etwas aufräumen, jeden Fall mit einer statisch ähnlichen reinen Funktion zu umhüllen, und nicht zu vergessen, jede Funktion passend zu benennen (oder eine generische Funktion mit Parametern zu erstellen). der Fall. Dadurch wird es besser lesbar.
10149900cookie-checkVerwendung von Vergleichsoperatoren in einer PHP-‘switch’-Anweisungyes
Ja, du kannst
switch(true)
und in den Fällen, die den Bereich Example erfüllen, true zurückgeben. Wenn dies in einem kleineren Maßstab wäre, könnten Sie einfach die Zahlen im Bereich wiederholen und sie ineinander fließen lassen. Beispiel. Aber ja, für Ihr Beispiel sollten Sie eine if-Anweisung verwenden.– David Chen
17. Juli 2014 um 20:26 Uhr
@DaveChen Das ist ein netter Trick.
– Havenar
17. Juli 2014 um 20:41 Uhr
Demnach können Sie anscheinend — nach (Randomizer) suchen — php.net/manual/en/control-structures.switch.php
– Tasos
17. Juli 2014 um 20:43 Uhr