PHP: switch
Часто вместо нескольких расположенных подряд операторов if else целесообразно воспользоваться специальной конструкцией switch-case . Оператор switch сравнивает значение условного выражения с несколькими значениями. Как правило, в качестве выражения используется переменная, в зависимости от значения которой должен быть исполнен тот или иной блок кода. Для сравнения в switch используется оператор равенства ( == ).
Представим себе переменную $action , которая может иметь значения «JUMP» (прыгать), «SWEEM» (плавать), «FLY» (летать). Оператор switch позволяет легко определить блок кода, который должен исполняться для каждого из этих значений. Чтобы показать разницу между операторами if и switch , выполним проверку переменной на соответствие нескольким значениям. Следующий пример показывает два различных способа сделать то же самое. Первый способ использует серию операторов if и elseif , а второй — оператор switch :
elseif ($action == 'SWEEM') < echo "Я люблю плавать."; >elseif ($action == 'FLY') < echo "Хотел бы я научиться летать."; >switch ($action) < case 'JUMP': echo "Мне нравится прыгать."; break; case 'SWEEM': echo "Я люблю плавать."; break; case 'FLY': echo "Хотел бы я научиться летать."; break; >?>
Оператор switch берет значение, возвращаемое условным выражением, и начинает сравнивать его со всеми значениями, стоящими рядом с ключевым словом case (метка), в порядке их следования. Как только совпадение обнаружено, выполняется соответствующий блок кода. Если соответствие не найдено, не исполняется ни один из блоков.
Примечание: условное выражение должно возвращать значение элементарного типа, например число или строку.
case
Обратите внимание, что за ключевым словом case каждый раз следует значение (литерал), после которого должно обязательно стоять двоеточие. Тип значения, указанного после оператора case , должен совпадать с типом значения возвращаемого условием. Перед началом исполнения тела (содержимое между фигурными скобками) оператора switch , переменная указанная в скобках, должна быть инициализирована каким-нибудь значением, поскольку это значение будет сравниваться со значениями, указанными после case. Инструкции, расположенные после case , будут исполняться до тех пор, пока не встретится оператор break .
Примечание: в операторе case может быть использовано любое выражение, которое приводится к простому типу, то есть к числу ( integer ), вещественному числу ( float ), строке ( string ) или логическому значению ( bool ).
break
Если должен быть выполнен только один блок кода, соответствующий определенному значению, то в конце этого блока следует вставить ключевое слово break . Интерпретатор PHP, встретив ключевое слово break , завершает работу оператора switch и переходит к исполнению инструкции, расположенной после закрывающей фигурной скобки оператора switch .
Конструкции case в операторе switch задают только начальную точку выполняемого программного кода, но не задают никаких конечных точек. В случае отсутствия ключевого слова break , оператор switch начнёт выполнение блока кода с метки ( case ), значение которой соответствует значению условного выражения, и продолжит выполнение инструкций до тех пор, пока не дойдет до конца всего блока. Поэтому стоит быть аккуратнее и не забывать завершать каждый блок case оператором break . В следующем примере показано, что происходит при отсутствии ключевого слова break :
"; case 'SWEEM': echo "Я люблю плавать.
"; case 'FLY': echo "Хотел бы я научиться летать.
"; > ?>
В результате работы скрипта, будут выведены все три записи. Однако иногда бывает полезным опускать намеренно оператор break, например в таких случаях, когда при совпадении одного из нескольких значений, должен исполняться один блок кода:
Обратите внимание на этот пример: список инструкций для выполнения в секции case может быть пустым, в этом случае управление просто передается далее по списку — следующему оператору case .
continue
Обратите внимание: оператор continue применяется в конструкциях switch и действует подобно оператору break .
Выбор по умолчанию
Если значение условного выражения не совпало ни с одним из предложенных значений в секциях case, оператор switch позволяет выполнить некоторые действия по умолчанию. Для этого используется ключевое слово default . Работает оно следующим образом: если значение возвращаемое условием не совпало ни с одним из предложенных значений в секциях case, оператор switch начинает выполнение инструкций расположенных в секции default .
"; case 'SWEEM': echo "Я люблю плавать.
"; case 'FLY': echo "Хотел бы я научиться летать.
"; default: echo 'Что-то мне вообще лень, что-либо делать.'; > ?>
Оператор default обычно указывается в конце тела switch , после всех меток ( case ). Это логичное и обычное место для него, но на самом деле, оператор default может быть расположен в любом месте внутри конструкции switch . Так как блок кода расположенный в секции default обычно является последним в теле switch , ключевое слово break чаще всего опускают.
Дополнительные сведения
Возможно у вас возник вопрос когда же лучше использовать оператор switch , если тоже самое можно сделать используя оператор if else ? Ответить на этот вопрос можно так: в операторе switch выражение вычисляется всего один раз и этот результат сравнивается с каждым значением оператора case. В условных выражениях elseif , значение выражения вычисляется каждый раз заново. Если ваше условие более сложное, чем простое сравнение и/или находится к примеру в цикле, в этом случае конструкция switch может работать быстрее, чем elseif .
На последок хотелось бы упомянуть о том, что вместо двоеточия после операторов case и default , можно использовать точку с запятой:
оператор php switch внутри другого оператора switch
У меня есть такая ситуация, когда у меня есть две проверки на переменные GET после проверки первого в одном операторе switch внутри оператора, вторая переменная должна быть проверена во втором операторе switch внутри первого цикла case Я не могу написать точный код здесь, но вот пример
else < switch($_GET['child'])< case 'test': echo 'test'; break; >> break; case 'child2': echo 'child2'; break; default: echo $_GET['parent']; > ?>
Работает отлично с этим примером кода, но когда я действительно использую эту процедуру на своем сервере, элемент управления передается по умолчанию в родительский оператор switch, даже если он имеет совпадающее значение case Об ошибках не сообщалось и cudn’t отлаживает больше, чем этот уровень Плз помогите мне! Я знаю, что вы хотите увидеть код, но я не могу опубликовать его здесь, по крайней мере, вы можете помочь мне отлаживать больше. Спасибо
Пожалуйста, опубликуйте URL-адрес, когда вы его вводите, что невозможно в этом скрипте. Это должно разобрать example.com?parent=child1 просто отлично.
Кажется, я не могу продублировать проблему: codepad.org/uoYT3WXS Попробуйте отредактировать пример codepad, чтобы продублировать вашу проблему.
2 ответа
В соответствии с примерами документации PHP, возможно, если блок case, содержащий вложенный ключ, заключен в фигурные скобки.
Я не вижу ошибок в коде. Я попробовал это на своей машине, и все работает отлично. Поскольку он также отлично подходит для вас, ошибка чаще всего находится где-то в другом месте.
Нет причин, по которым вложенные операторы switch не могут быть возможны, поскольку операторы switch определяются следующим образом:
[statement] можно заменить простой командой, например echo «test»; , серией команд echo «test»; echo «test»; или другим оператором switch. Добавление фигурных скобок ничего не меняет, поскольку они просто служат для группировки серии команд, поэтому для части then можно использовать более одной команды в условных выражениях, таких как if([condition]) [then] . Вышеприведенный ответ, который на удивление имеет 18 зазоров за неправильное консультирование по добавлению фигурных скобок, ничего не меняет.В заключение можно утверждать, что вложенные операторы switch и способ их использования в вашем примере кода верны. Ошибка в другом месте.
switch
Оператор switch подобен серии операторов IF с одинаковым условием. Во многих случаях вам может понадобиться сравнивать одну и ту же переменную (или выражение) с множеством различных значений, и выполнять различные участки кода в зависимости от того, какое значение принимает эта переменная (или выражение). Это именно тот случай, для которого удобен оператор switch.
Замечание: Обратите внимание, что в отличие от некоторых других языков, оператор continue применяется в конструкциях switch и действует подобно оператору break. Если у вас конструкция switch находится внутри цикла, и вам необходимо перейти к следующей итерации цикла, используйте continue 2.
Замечание:
Заметьте, что конструкция swich/case использует неточное сравнение (==).
Следующие два примера иллюстрируют два различных способа написать то же самое. Один использует серию операторов if и elseif, а другой — оператор switch:
Пример #1 Оператор switch
if ( $i == 0 ) echo «i равно 0» ;
> elseif ( $i == 1 ) echo «i равно 1» ;
> elseif ( $i == 2 ) echo «i равно 2» ;
>
?php
switch ( $i ) case 0 :
echo «i равно 0» ;
break;
case 1 :
echo «i равно 1» ;
break;
case 2 :
echo «i равно 2» ;
break;
>
?>
Пример #2 Оператор switch допускает сравнение со строками
switch ( $i ) case «яблоко» :
echo «i это яблоко» ;
break;
case «шоколадка» :
echo «i это шоколадка» ;
break;
case «пирог» :
echo «i это пирог» ;
break;
>
?>?php
Важно понять, как оператор switch выполняется, чтобы избежать ошибок. Оператор switch исполняет строчка за строчкой (на самом деле выражение за выражением). В начале никакой код не исполняется. Только в случае нахождения оператора case, значение которого совпадает со значением выражения в операторе switch, PHP начинает исполнять операторы. PHP продолжает исполнять операторы до конца блока switch либо до тех пор, пока не встретит оператор break. Если вы не напишете оператор break в конце секции case, PHP будет продолжать исполнять команды следующей секции case. Например :
switch ( $i ) case 0 :
echo «i равно 0» ;
case 1 :
echo «i равно 1» ;
case 2 :
echo «i равно 2» ;
>
?>?php
В этом примере, если $i равно 0, то PHP исполнит все операторы echo! Если $i равно 1, PHP исполнит два последних оператора echo. Вы получите ожидаемое поведение оператора (‘i равно 2’ будет отображено) только, если $i будет равно 2. Таким образом, важно не забывать об операторах break (даже если вы, возможно, хотите избежать его использования по назначению при определенных обстоятельствах).
В операторе switch выражение вычисляется один раз и этот результат сравнивается с каждым оператором case. В выражении elseif, выражение вычисляется снова. Если ваше условие более сложное, чем простое сравнение и/или находится в цикле, конструкция switch может работать быстрее.
Список операторов для исполнения в секции case также может быть пустым, что просто передает управление списку операторов в следующей секции case.
switch ( $i ) case 0 :
case 1 :
case 2 :
echo «i меньше чем 3, но неотрицательно» ;
break;
case 3 :
echo «i равно 3» ;
>
?>?php
Специальный вид конструкции case — default. Сюда управление попадает тогда, когда не сработал ни один из других операторов case. Например:
switch ( $i ) case 0 :
echo «i равно 0» ;
break;
case 1 :
echo «i равно 1» ;
break;
case 2 :
echo «i равно 2» ;
break;
default:
echo «i не равно 0, 1 или 2» ;
>
?>?php
Выражением в операторе case может быть любое выражение, которое приводится в простой тип, то есть в тип integer, или в тип с плавающей точкой (float), или строку. Массивы или объекты не могут быть здесь использованы до тех пор, пока они не будут разыменованы до простого типа.
Возможен альтернативный синтаксис для управляющей структуры switch. Для более детальной информации, см. Альтернативный синтаксис для управляющих структур.
switch ( $i ):
case 0 :
echo «i равно 0» ;
break;
case 1 :
echo «i равно 1» ;
break;
case 2 :
echo «i равно 2» ;
break;
default:
echo «i не равно to 0, 1 или 2» ;
endswitch;
?>?php
Возможно использование точки с запятой вместо двоеточия после оператора case. К примеру :
switch( $beer )
case ‘tuborg’ ;
case ‘carlsberg’ ;
case ‘heineken’ ;
echo ‘Хороший выбор’ ;
break;
default;
echo ‘Пожалуйста, сделайте новый выбор. ‘ ;
break;
>
?>?php