Ошибка оператора switch php при int = 0

У меня проблема с футляром.

Когда я устанавливаю $ number = 0, он должен работать в первом порядке, но здесь этот код возвращает 10-20K, что во втором случае.

Я проверил операторы сравнения, протестировал их, если в противном случае они вернут правильные значения, но здесь первый случай не выполняется на $ number = 0

Почему это происходит ? php считать 0 ложным или что-то не так в коде?

Ссылка на пачку кодовых страниц http://codepad.org/2glDh39K

также вот код

<?php $number = 0; switch ($number) { case ($number <= 10000): echo "0-10K"; break; case ($number > 10000 && $number <= 20000): echo "10-20K"; break; case ($number > 20000 && $number <= 30000): echo "20-30K"; break; case ($number > 30000 && $number <= 40000): echo "30-40K"; break; case ($number > 40000 && $number <= 50000): echo "40-50K"; break; case ($number > 50000 && $number <= 60000): echo "50-60K"; break; case ($number > 60000 && $number <= 70000): echo "60-70K"; break; case ($number > 70000 && $number <= 80000): echo "70-80K"; break; case ($number > 80000 && $number <= 90000): echo "80-90K"; break; case ($number > 90000): echo "90K+"; break; default: //default echo "N/A"; break; } ?> 

 switch ($number) { case ($number <= 10000): // check $number == ($number <= 10000) echo "0-10K"; break; // you hit the below because `0 == false` is true in php case ($number > 10000 && $number <= 20000): // check $number == ($number > 10000 && $number <= 20000) echo "10-20K"; break; // ... 

Но вы можете сделать это с меньшим количеством кода:

 function showRange($number) { if ($number > 90000) { echo "90K+"; return; } echo sprintf("%s-%sK", (int) ($number / 10000) * 10, ((int) ($number / 10000) +1) * 10 ); } 

Вы почти используете switch в обратном порядке, но не совсем. Вам нужно либо полностью перевернуться, записав switch(true) :

 switch (true) { // IMPORTANT CHANGE HERE! case ($number <= 10000): echo "0-10K"; break; case ($number > 10000 && $number <= 20000): echo "10-20K"; break; // etc } 

или иначе измените все на if / else :

 if ($number <= 10000) { echo "0-10K"; else if ($number > 10000 && $number <= 20000) { echo "10-20K"; } // etc 

Две важные заметки:

  1. Обратный switch обычно выглядит ужасно противоинтуитивным в первый раз, когда вы его видите. Пожалуйста, не используйте его, если вы не чувствуете себя комфортно с ним.
  2. Ваши условные обозначения могут быть упрощены – если предположить, что они выглядят по порядку, каждая часть $number > X становится излишней из-за того, что проверка в предыдущем условном выражении ( $number <= X ) уже сработала. Однако можно утверждать, что сохранение проверок делает код более надежным перед лицом модификации.
 $number = 0; var_dump($number); // int(0) 

Если вы измените оператор на case ($number > 0 && $number <= 10000): это странно работает. Но он работает с любым произвольным поиском ( $number > 9091 && $number <= 10000 ).

Даже с полным болотом ниже:

 $number = 0; $jonskeet = false; switch ($number) { case ($jonskeet === true && $number <= 10000): echo "0-10K"; // ... 

Он будет выводить 0-10K даже если одно и то же условие в выражении if не будет работать.

Проблема в том, что select не должен использоваться с длинными условными обозначениями. select может использоваться для выполнения чего-либо, если значение переменной равно тому, что находится после ключевого слова case . Видеть:

 select ($user_rank) { case 0: return "guest"; break; case 1: return "user"; break; // ... default: return "unknown"; break; } 

Но у вас есть длинные условия в case вашего кода.

 case ($number <= 10000): echo "0-10K"; break; case ($number > 10000 && $number <= 20000): echo "10-20K"; break; 

Выполнение этого сначала переводит $number <= 10000 в TRUE и $number > 10000 && $number <= 20000 в FALSE , как и два оператора. И после этого ваш код выполняется следующим образом:

 case TRUE: echo "0-10K"; break; case FALSE: echo "10-20K"; break; 

$number равно 0 , но он также может вызывать FALSE в FALSE , поэтому вы получаете не желаемый результат.

В качестве решения вы должны перевести свой код для установки ifelseifelse :

  if ( $number < 10000 ) { echo "0-10K"; } else if ( $number > 10000 && $number <= 20000 ) { echo "10-20K"; // ... } else { echo "N/A"; } 

Когда вы выполняете метод case switch, вы не можете сопоставлять его с таким логическим значением. Вам нужно сравнить только полученное значение.

Я думаю, вы должны переписать свой код, чтобы использовать if...then...elseif statements.

 if ($number <= 10000){ echo "0-10K"; }elseif($number <= 20000){ echo "10-20K"; }elseif($number <= 30000){ echo "20-30K"; }elseif($number <= 40000){ ... } 

Используя этот метод, вам не нужно делать две проверки каждый раз, потому что предыдущие операторы if проверяют эти условия. IE: Если вы достигнете второго оператора if , вы уже знаете, что значение не меньше (или равно) 1000 поэтому оно должно быть больше 10000 .

Да, для PHP 0 FALSE (если вы не используете === ). И да, ваш код неверен – switch не для сравнения диапазонов – это для сравнения значений (по крайней мере, в PHP, в Ruby или Perl 6 это другое дело), ​​как и там.

 switch ($letter) { case 'a': echo "A?"; break; default: echo "Unknown letter"; break; } 

В вашем случае вы сравниваете число с условиями – они возвращают true или false . Поскольку значение 0 false , второе условие улавливается. switch не был создан для такого кода, я бы использовал, if else вместо этого, или переписал вашу логику – повторение – это не очень хорошая идея.

 $range_number = floor($number / 1000); echo $range_number, $range_number ? "K" : "", "-", $range_number + 1, "K"; 

(кстати, я знаю, что switch (true) работает, но не использует его – это уродливый взлом)

Здесь, если $ i равно 0, PHP выполнит все инструкции эха!

поэтому он выполняет инструкцию следующего случая, и в этом случае происходит отрыв от него

поэтому используйте if-else-if вместо случая переключения

 if ($number <= 10000){ echo "0-10K"; }elseif( $number <= 20000){ echo "10-20K"; }elseif( $number <= 30000){ echo "20-30K"; }elseif( $number <= 40000){ echo "90K+"; } ... elseif( $number <= 90000) echo "80-90K"; }elseif($number > 90000){ echo "90K+"; } 

Вы не можете действительно сделать случай переключения для диапазона number.Use if () {} else {} для этой цели.