2009-11-26 3 views
6

Nie rozumiem, co się tutaj dzieje. Logicznie, nie ma dla mnie żadnego sensu.Instrukcja PHP CASE nie działa z wartościami ZERO

<?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; 
?> 

Kiedy poziom $ = = 0, zwraca "wysoki". To nie ma dla mnie żadnego sensu. Czy ktoś może wyjaśnić, co się tutaj dzieje?

Odpowiedz

26

Zmień switch ($level) na switch (true) i to zadziała.

switch Wykonywane są testy równości na wartościach w przypadkach. PHP ocenia twoje porównania >, więc case $level > 80 staje się case false. false jest uznawany za równy 0, więc pierwszy przypadek pasuje.

+2

To ma teraz dla mnie taki sens. Miałem fundamentalne nieporozumienie w działaniu przełącznika. Dzięki za edukację! – pbarney

+0

@pbamey, tak, dobra odpowiedź, zgadzam się, więc zaakceptuj to i daj Philowi ​​należne. – Don

+4

Nie jestem pewien, czy byłby to zalecany sposób użycia instrukcji switch, ale nie powiedziałbym, że czyta się bardzo dobrze. –

5

Ilość po numerze case musi być tylko wartością, a nie wyrażeniem boolowskim. Zgaduję, że PHP ocenia case $level > 80 jako case ($level > 80), który staje się case 0 (tj. False, ponieważ $level jest rzeczywiście NIE mniejszy niż 80), więc dopasowujesz pierwszy przypadek.

0

Czy jesteś pewien, że możesz to zrobić w php?

Właśnie sprawdziłem manual of switch i musisz podać wyraźną wartość.

Myślę, że jeśli można napisać go ponownie w coś podobnego:

$levelDivTwenty = intval($level/20); 
$levelDivTwenty = ($levelDivTwenty>4)?4:$levelDivTwenty; 

a następnie przypadku na tym.

switch ($levelDivTwenty) { 
    case 4: //same as $level > 80 before... 
    case 3: //>60 etc... 
} 
1

Jak inni zwrócili uwagę, że nie można używać przełącznik tak, ale jak o zdefiniowanie go tak:

<? 
$level = 21; 
$answers = array('low', 'low-to-moderate', 
       'moderate', 'moderate-to-high', 'high'); 

echo $answers[intval(($level-1)/20)]; 
?> 

Uwaga: Jeśli poziom $ = 0, następnie wyrażenie wewnątrz intval() będzie -1/20, , która jest mniejsza niż -1, a zatem zostanie zaokrąglona do 0.

+0

To interesujące podejście – pbarney

1

To nie jest tak, jak przełącznik ma być używany. Ma ocenić konkretną wartość.

Użyj opcji Jeśli/w przeciwnym razie, zamiast komplikować życie, aby przełącznik działał jak jeden.