Вопрос по php, switch-statement – Ошибка оператора переключения php на int = 0
Я имею проблему в случае переключателя php.
Когда я установлю$ Число = 0 это должно бежать самое первоедело но вот этот код возвращает10-20K это во втором случае.
Я проверил операторы сравнения, проверил их, если еще они возвращают правильные значения, но здесь первый случай не работает$ Число = 0
Почему это происходит ? php считает 0 ложным или что-то не так в коде?
Ссылка на кодовую вставкуhttp://codepad.org/2glDh39K
также вот код
$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
вПРАВДА а также$number > 10000 && $number <= 20000
вЛОЖНЫЙвроде двух утверждений. И после этого ваш код выполняется следующим образом:
case TRUE:
echo "0-10K";
break;
case FALSE:
echo "10-20K";
break;
$number
является0
, но это может означатьFALSE
тоже, поэтому вы получаете нежелательный результат.
В качестве решения вы должны перевести свой код, чтобы иметь -if
elseif
else
настроить:
if ( $number < 10000 ) {
echo "0-10K";
} else if ( $number > 10000 && $number <= 20000 ) {
echo "10-20K";
// ...
} else {
echo "N/A";
}
Да для PHP0
являетсяFALSE
(если вы не используете===
). И да, ваш код неверен -switch
ISN»т для сравнения диапазонов - этоs для сравнения значений (по крайней мере, в PHP, в Ruby или Perl 6 это 'это другое дело) вроде там.
switch ($letter) {
case 'a':
echo "A?";
break;
default:
echo "Unknown letter";
break;
}
В вашем случае вы сравниваете число с условиями - те либо возвращаютtrue
или жеfalse
, Как0
являетсяfalse
Второе условие ловит.switch
WASN»я сделал бы для такого кода, я хотел бы использоватьif
else
вместо этого или переписать свою логику - повторить нехорошая идея
$range_number = floor($number / 1000);
echo $range_number, $range_number ? "K" : "", "-", $range_number + 1, "K";
(кстати, я знаю, чтоswitch (true)
работает, но нене использовать это - этобезобразный хак)
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 );
}
Здесь, если $ i равно 0, PHP выполнит все операторы echo!
поэтому его выполнить оператор следующего случая, и в этом случае есть выход из него
так что используйте 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+";
}
не совпадает с логическим значением, как это. Вам нужно только сравнить полученное значение.
Я думаю, что вы должны переписать свой код для использованияif...then...elseif
заявления.
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
Выпочти с использованием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
) уже не удалось. Тем не менее, можно утверждать, что сохранение проверок делает код более надежным перед лицом изменений.