PHP CASE-Anweisung nicht mit Null-Werten arbeiten
-
05-07-2019 - |
Frage
Ich verstehe nicht, was hier passiert. Logischerweise macht es keinen Sinn für mich.
<?php
$level = 0;
switch ($level) {
case $level > 80: $answer = 'high'; break;
case $level > 60: $answer = 'moderate-to-high'; break;
case $level > 40: $answer = 'moderate'; break;
case $level > 20: $answer = 'low-to-moderate'; break;
default: $answer = 'low'; break;
}
echo $answer;
?>
Wenn $ Ebene == 0, es "hoch" zurückgibt. Das macht keinen Sinn für mich. Kann jemand erklären, was hier passiert?
Lösung
Ändern switch ($level)
switch (true)
und dies funktionieren wird.
switch
Aussagen führen Gleichheitstests auf den Werten in den Fällen. PHP ist die Bewertung Ihrer >
Vergleiche, so case $level > 80
wird case false
. false
gilt als gleich 0
sein, so dass der erste Fall entspricht.
Andere Tipps
Die Menge nach dem case
muss nur der Wert, kein boolean Ausdruck. Ich vermute, dass PHP case $level > 80
als case ($level > 80)
prüft die case 0
immer (das heißt, falsch, da $level
ist in der Tat nicht weniger als 80) und so sind Sie den ersten Fall entsprechen.
Wie andere haben darauf hingewiesen, sie können nicht Schalter wie das, aber wie wäre es wie folgt definieren:
<?
$level = 21;
$answers = array('low', 'low-to-moderate',
'moderate', 'moderate-to-high', 'high');
echo $answers[intval(($level-1)/20)];
?>
Hinweis : Wenn $ level = 0 , dann Ausdruck in intval () wird -1/20 , , die weniger als -1 ist und daher abgerundet wird 0 .
Das ist nicht wirklich wie Schalter verwendet werden soll. Es ist für einen bestimmten Wert zu bewerten.
Verwenden Sie eine If / else hier, wenn statt Ihr Leben zu komplizieren einen Schalter Arbeit wie möglich zu gestalten.
Sind Sie sicher, dass Sie dies in PHP tun können?
Ich habe gerade überprüft die Anleitung Schalter und Sie haben einen eindeutigen Wert zu liefern.
Ich denke, wenn man es wieder in so etwas wie schreiben:
$levelDivTwenty = intval($level/20);
$levelDivTwenty = ($levelDivTwenty>4)?4:$levelDivTwenty;
und dann Fall, dass auf.
switch ($levelDivTwenty) {
case 4: //same as $level > 80 before...
case 3: //>60 etc...
}