У меня проблема с футляром.
Когда я устанавливаю $ 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
Две важные заметки:
switch
обычно выглядит ужасно противоинтуитивным в первый раз, когда вы его видите. Пожалуйста, не используйте его, если вы не чувствуете себя комфортно с ним. $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
, поэтому вы получаете не желаемый результат.
В качестве решения вы должны перевести свой код для установки if
– elseif
– else
:
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 {} для этой цели.