странное поведение с переключателем PHP? - PullRequest
0 голосов
/ 25 июля 2011

Пример того, что я пытаюсь сделать, будет более явным:

   var_dump($opti_point); //int 0

    if ($opti_point>=0 && $opti_point < 25) echo 'good';//echoing good

    switch ($opti_point) {

        case ($opti_point>= 0 && $opti_point < 25):
            $test = 0;
            break;

        case ($opti_point >= 25 && $opti_point < 50):
            echo 'we are in this case'; // This case is called !
            $test = 2;
            break;

        default:
            test = 0;
            break;
    }

Здесь есть хитрость?

thx

Ответы [ 7 ]

3 голосов
/ 25 июля 2011

Вам нужно изменить аргумент switch на true из false, если вы сравниваете его в случаях.

3 голосов
/ 25 июля 2011

К сожалению, вы не можете помещать сравнения в "case" ... Переключатель используется только тогда, когда значение может иметь одно из ограниченного числа значений, например, так:

switch ( $val ) {
  case 1:
    echo "Got 1";
    break;
  case 2:
    echo "Got 2";
    break;
  default:
    echo "Got invalid value";
}

Обходной путь - использовать:

switch (true) {
    case ($opti_point>= 0 && $opti_point < 25):
        $test = 0;
        break;

    case ($opti_point >= 25 && $opti_point < 50):
        echo 'we are in this case';
        $test = 2;
        break;

    default:
        test = 0;
        break;
}

, который будет работать, но немного уродливо ...

Кроме того, в echo we are in this case'; отсутствует одна кавычка, которая должна быть echo 'we are in this case';

Вы должны использовать вместо if =)

1 голос
/ 25 июля 2011

если это точный код, попробуйте это </p> <p>var_dump($opti_point); //int 0</p> <pre><code>if ($opti_point>=0 && $opti_point < 25) echo 'good';//echoing good switch ($opti_point) { case ($opti_point>= 0 && $opti_point < 25): $test = 0; break; case ($opti_point >= 25 && $opti_point < 50): echo 'we are in this case'; // This case is called ! $test = 2; break; default: $test = 0; break; }

1 голос
/ 25 июля 2011

Вы не сравниваете то, что, по вашему мнению, вы сравниваете. Это код, который, я думаю, вы хотите.

var_dump($opti_point); //int 0

if ($opti_point>=0 && $opti_point < 25) {
    $test = 0;
    echo 'You are now here!';
} elseif ($opti_point >= 25 && $opti_point < 50) {
    $test = 2;
} else {
    test = 0;
}

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

($opti_point>=0 && $opti_point < 25) // true

К значению $ opti_point

0 // false

Таким образом, PHP на самом деле преобразует то, что вы думаете в виде целого числа, в логическое значение, чтобы сравнить его с результатом условного оператора.

1 голос
/ 25 июля 2011

Я вернусь с тобой код

   var_dump($opti_point); //int 0 , or false  --- you should use TRUE

    if ($opti_point>=0 && $opti_point < 25) echo 'good';//echoing good

    switch ($opti_point) { // chose the case that is $opti_point (0 or false)

        case ($opti_point>= 0 && $opti_point < 25): // true, so go to next
            $test = 0;
            break;

        case ($opti_point >= 25 && $opti_point < 50): //false si this is the wan I pick
            echo 'we are in this case'; // This case is called !
            $test = 2;
            break; // ingore the rest

        default:
            test = 0;
            break;
    }

вы должны использовать TRUE в коммутаторе

1 голос
/ 25 июля 2011

Вы неправильно понимаете, как работает switch-case.Case НЕ ИСПЫТЫВАЕТ ВАШЕ ВЫРАЖЕНИЕ НА БУЛЕВОЙ ИСТИНА!

Сравнивает свое значение со значением 'switch'!

Вот объяснение:

$opti_point>= 0 && $opti_point < 25 возвращает значение true, целочисленное представление которого равно 1, и поскольку PHP может работать с типами самостоятельно, оно становится равным 1 и сравнивает его со значением в переключателе, равным 0

$opti_point >= 25 && $opti_point < 50оценивается как false, что равно 0 как целое число, так что ... это ваш случай;)

1 голос
/ 25 июля 2011

Я думаю, что это очень плохой способ использовать оператор switch, вы не должны помещать условные предложения в случаях ... На самом деле, я уверен, что это будет незаконно в других языках, и я не уверен, что это должно работать в PHP. Вместо этого используйте несколько объединенных условий if-else:

if ($i == 0) {
    echo "i equals 0";
} elseif ($i == 1) {
    echo "i equals 1";
} elseif ($i == 2) {
    echo "i equals 2";
}
...