2010-08-23 3 views
3

Что случилось с моим переключателем? Теперь результат:переключатель использования php без перерыва;

< more 
> less 
= equality 
!= no't equality 

Как должно быть:

< more 
= equality 

<?php 
$page = 99; 

    switch ($page) 
    { 
     case $page < 121: 
      echo '< more <br/>'; 
     case $page > 123: 
      echo '> less <br/>'; 
     case $page == 99: 
      echo '= equality <br/>'; 
     case $page != 99: 
      echo '!= no\'t equality <br/>'; 
    } 
    ?> 
+8

Вот как работает 'switch', без' break'. См. [Документы] (http://php.net/switch). – salathe

+4

btw, '>' означает «больше» и '<' означает «меньше». Кажется, вы ошибаетесь. – Piskvor

+2

Это либо «нет равенства», либо «не равно»; но «нет равенства» не имеет никакого смысла. – Gumbo

ответ

12

В вашем операторе switch вы сравниваете число с булевыми значениями.
Давайте рассмотрим первый случай $page < 121 является true, так что сравнение происходит в 99==true который true согласно http://docs.php.net/language.types.type-juggling (switch выполняет рыхлое сравнение, не строгие, как ===). Таким образом, выполняется первый блок case.
И поскольку у вас нет инструкции break, она переходит к следующему блоку корпуса, а затем и так далее ...
Значение: Это не будет работать должным образом, независимо от того, используете ли вы break или нет.

+0

+1. Даже с «break» код OP неправильный. 'switch' сравнивает значение' switch' с значением 'case'. Он не ищет истинных значений «case». Это легко увидеть, если вы попробуете 0. Он (ошибочно) начнет выполнение во втором, потому что '0 == (0> 123)', но '0! = (0 <121)'. –

+0

Да, 'break' не будет исправлять это ... для ясности, добавленной к ответу. – VolkerK

-1
«; break; кейс $ page> 123: echo '> меньше
'; break; case $ page == 99: echo '= равенство
'; break; case $ page! = 99: echo '! = No \' t равенство
'; break; default: echo 'Default'; } ?>
+0

Yup. Без 'break',' switch' перейдет к следующему 'case'. – Piskvor

+1

Плутов: 'default' здесь не нужен, так как он никогда не будет достигнут, а' $ page == 99' не будет достигнута (либо $ page <121, либо между 121 и 123 (тогда это! = 99), или> 123) – Piskvor

+3

Этот код по-прежнему неправ, как объяснил Фолькер и Черепаха. –

8

Вы, похоже, не понимаете, как работает коммутатор. То, что вы хотите, это серия, если заявления, то есть

 if ($page < 121) 
      echo '< more <br/>'; 
     if ($page > 123) 
      echo '> less <br/>'; 
     if ($page == 99) 
      echo '= equality <br/>'; 
     if ($page != 99) 
      echo '!= no\'t equality <br/>'; 
5

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

switch ($variable) 
{ 
    case "me": 
     echo "variable is me"; 
     break; 

    case "you": 
     echo "variable is you"; 
     break; 
    default: 
     echo "Variable is neither of us"; 

} 

выше случае блок коммутатор может быть записан, как показано ниже:

if ($variable=="me") 
{ 
    echo "variable is me"; 
} 
elseif ($variable=="you") 
{ 
    echo "variable is you"; 
} 
else 
{ 
    echo "variable is neither of us"; 
} 

НЕ помещайте выражение вблизи сазе.

switch ($somethng) 
{ 
    case $something < 10: 
     break; 
    case $something > 20: 

    break; 
} 

Коммутатор предназначен для использования только для сравнения переменной с набором значений. ТОЛЬКО! Для всего остального используйте инструкцию if ... elseif..else.

Этот блок неправильный. Иногда может быть правдой более одного из этих выражений.

0

Если я не ошибаюсь, вы не можете использовать эти символы <> raw в html. вместо этого использовать объекты & gt; и & lt ;.

Если вы запустили скрипт в командной строке, я получил следующий вывод.

<?php 
ob_start(); 
$page = 99; 

switch ($page) 
{ 
    case $page < 121: 
     echo '< more <br/>'; 
    case $page > 123: 
     echo '> less <br/>'; 
    case $page == 99: 
     echo '= equality <br/>'; 
    case $page != 99: 
     echo '!= no\'t equality <br/>'; 
} 

$buffer = ob_get_clean(); 

echo str_replace('<br/>', "\n", $buffer); 

выход

< more 
> less 
= equality 
!= no't equality 

, который кажется правильным behavoir.

Важно понять, как оператор переключателя выполнен в порядке , чтобы избежать ошибок. Оператор switch выполняет строку за строкой (фактически, утверждение по заявлению). В начало, код не выполняется. Только в том случае, если оператор case найден со значением, которое соответствует значению , выражение switch делает PHP начинающим для выполнения операторов. PHP продолжает выполнять операторы до конца блока переключателя, или при первом просмотре сообщения .

http://de.php.net/manual/de/control-structures.switch.php

1
$var = "cat"; 

switch($var) 
{ 
    case "cat": 
    echo 'My '.$var.' is called Bob.'; 
    break; 
    case "dog": 
    echo 'My '.$var.' is called James.'; 
    break; 
    default: 
    echo "I don't have an animal"; 
    break; 
} 

В коммутаторе statemant сравнить $ вар против стоимости в случае. Если есть совпадение, фактический случай будет выполнен, в противном случае будет выполнен по умолчанию. Вы не можете использовать <>! = ... в случае, только значения: 1, '1', 'dog', $ var2 и т. Д.

Если вы хотите, чтобы выполнить ту же команду на два случая вы можете сделать:

$var = "cat"; 

switch($var) 
{ 
    case "cat": 
    case "dog": 
    echo 'My '.$var.' is called James.'; 
    break; 
    default: 
    echo "I don't have an animal"; 
    break; 
} 

В своем коде, ваш забыл поставить перерыв; в конце каждого случая, поэтому вы видите «все» в своем выпуске. И вы пропускаете по умолчанию: тоже.

Для выполнения задачи, я предлагаю вам использовать инструкции if.

Смежные вопросы