Оператор PHP CASE не работает с значениями 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; ?> 

Когда $ level == 0, он возвращает «высокий». Это не имеет никакого смысла для меня. Может кто-нибудь объяснить, что здесь происходит?

Related of "Оператор PHP CASE не работает с значениями ZERO"

Изменить switch ($level) на switch (true) и это сработает.

операторы switch выполняют тесты равенства для значений в случаях. PHP оценивает ваши > сравнения, поэтому case $level > 80 становится case false . false считается равным 0 , поэтому первый случай соответствует.

Количество после case должно быть просто значением, а не логическим выражением. Я предполагаю, что PHP оценивает case $level > 80 как case ($level > 80) который становится case 0 (т. Е. False, поскольку $level действительно не менее 80), и поэтому вы соответствуете первому случаю ,

Как указывали другие, вы не можете использовать такой переключатель , но как определить его так:

 <? $level = 21; $answers = array('low', 'low-to-moderate', 'moderate', 'moderate-to-high', 'high'); echo $answers[intval(($level-1)/20)]; ?> 

Примечание : Если $ level = 0 , то выражение внутри intval () будет равно -1/20 , что меньше -1 и поэтому будет округлено до 0 .

На самом деле это не так, как должен использоваться коммутатор. Он должен оцениваться по определенному значению.

Используйте if / else, если здесь, вместо того, чтобы усложнять вашу жизнь, чтобы сделать работу переключателя такой, как одна.

Вы уверены, что можете сделать это в php?

Я просто проверил руководство коммутатора, и вы должны предоставить отличное значение.

Я думаю, если вы можете написать это снова во что-то вроде:

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

а затем случай на этом.

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