PHP CASE оператор не работает с нулевыми значениями - PullRequest
6 голосов
/ 26 ноября 2009

Я не понимаю, что здесь происходит. Логично, что для меня это не имеет никакого смысла.

<?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, возвращается «высокий». Это не имеет никакого смысла для меня. Может кто-нибудь объяснить, что здесь происходит?

Ответы [ 5 ]

27 голосов
/ 26 ноября 2009

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

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

5 голосов
/ 26 ноября 2009

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

1 голос
/ 26 ноября 2009

Это не совсем то, как переключатель предназначен для использования. Это для оценки конкретного значения.

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

1 голос
/ 26 ноября 2009

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

<?
$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 .

0 голосов
/ 26 ноября 2009

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

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

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

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

и затем дело об этом.

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