Вопрос по php, switch-statement – Ошибка оператора переключения php на int = 0

2

Я имею проблему в случае переключателя php.

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

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

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

Ссылка на кодовую вставкуhttp://codepad.org/2glDh39K

также вот код


Ваш Ответ

7   ответов
0

на самом деле не нужно переключать регистр для диапазона числа. Для этого используйте if () {} else {}.

3
$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 тоже, поэтому вы получаете нежелательный результат.

В качестве решения вы должны перевести свой код, чтобы иметь -ifelseifelse настроить:

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

Да для 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) работает, но нене использовать это - этобезобразный хак)

4
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 );
}
Более простой? Безразлично»это не похоже на меня. Меньше кода - да, но читаемость здесь страдает. Lix
@JagdeepSingh You 'добро пожаловать :) xdazz
Большое спасибо ... Отличный ответ ... Jagdeep Singh
@Lix Хорошо, этоПросто личный вкус. xdazz
1

Здесь, если $ 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+";
}
@hakra - прежде всего спасибо за ваш ответ :) в switch, если есть 0, он выполнит 2-й случай, затем прервет; потому что в первом случае он будет проверять $ number (0 действует как ложь) == ($ number <= 10000) (действует как true) // так false == true // результат false аналогично условие станет истинным через секунду, поэтому оно выполняло 2-й случай. Спасибо :) Jagdeep Singh
Трудно понять, что вы говорите здесь ... Lix
@Lix, я имею в виду, что если в switch есть 0, то все регистры будут выполнены Database_Query
@JagdeepSingh очень приветствуется Database_Query
2

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

Я думаю, что вы должны переписать свой код для использования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

4

Выпочти с использованием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
}

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

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

Два важных замечания:

Задний ходswitch обычно выглядит ужасно нелогичным, когда вы впервые это видите. Пожалуйста, не используйте его, если вы неЯ чувствую себя комфортно с этим.Ваши условия могут быть упрощены - при условии, что они появляются по порядку, каждый$number > X часть делается избыточной из-за того, что проверка в предыдущем условном ($number <= X) уже не удалось. Тем не менее, можно утверждать, что сохранение проверок делает код более надежным перед лицом изменений.
именно то, что я искал ... спасибо :) Jagdeep Singh

Похожие вопросы