Конструкция switch-case в PHP

В PHP есть специальная конструкция switch-case, которая используется для выбора одного значения из некоторого ряда значений. Изучите ее синтаксис:

<?php switch (переменная) { case 'значение1': /* здесь код, который выполнится в случае, если переменная имеет значение1 */ break; case 'значение2': /* здесь код, который выполнится в случае, если переменная имеет значение2 */ break; case 'значение3': /* здесь код, который выполнится в случае, если переменная имеет значение3 */ break; default: /* здесь код, который выполнится в случае, если не совпала ни с одним значением */ break; } ?>

Как вы можете заметить, switch-case представляет собой альтернативу множеству elseif. Давайте посмотрим на примере. Пусть у нас есть вот такой код:

<?php $lang = 'ru'; if ($lang === 'ru') { echo 'рус'; } elseif ($lang === 'en') { echo 'анг'; } elseif ($lang === 'de') { echo 'нем'; } else { echo 'язык не поддерживается'; } ?>

Перепишем этот код через конструкцию switch-case:

<?php $lang = 'ru'; switch ($lang) { case 'ru': echo 'рус'; break; case 'en': echo 'англ'; break; case 'de': echo 'нем'; break; default: echo 'язык не поддерживается'; break; } ?>

Переменная $num может принимать значения 1, 2, 3 или 4. Определите, в какую пору года попадает значение этой переменной.

Необязательность default

Блок default является необязательным. Давайте его уберем из предыдущего кода:

<?php $lang = 'ru'; switch ($lang) { case 'ru': echo 'рус'; break; case 'en': echo 'англ'; break; case 'de': echo 'нем'; break; } ?>

Необязательность break

Команда break является необязательной. Без нее, однако, поведение блоков case будет неожиданным. Давайте посмотрим на примере. Пусть у нас есть вот такой код:

<?php $num = 1; switch ($num) { case 1: echo 1; break; case 2: echo 2; break; case 3: echo 3; break; } ?>

Уберем в нем все break, а в переменную $num для начала запишем число 3.

Пока все будет работать так, как и работало:

<?php $num = 3; // пусть здесь число 3 switch ($num) { case 1: echo 1; case 2: echo 2; case 3: echo 3; } // После запуска код выведет 3 - все хорошо ?>

Давайте теперь в переменную $num запишем число 2. В этом случае у нас ожидаемо выполнится case 2, а затем неожиданно еще и case 3:

<?php $num = 2; switch ($num) { case 1: echo 1; case 2: echo 2; case 3: echo 3; } // После запуска код выведет 2, а затем 3 ?>

Если же в переменную $num записать число 1, то вообще выполнятся все конструкции case:

<?php $num = 1; switch ($num) { case 1: echo 1; case 2: echo 2; case 3: echo 3; } // После запуска код выведет 1, затем 2, а затем 3 ?>

То есть получается, что при отсутствии break после выполнения задуманного case, выполнятся и все case ниже него. Иногда такую особенность используют, при решении задач.

В следующем примере, если переменная $num имеет значение 1 или 2, то в переменную $result запишется 'a'. Если же переменная $num имеет значение 3, то в переменную $result запишется 'b':

<?php $num = 1; switch ($num) { case 1: case 2: $result = 'a'; break; case 3: $result = 'b'; break; } echo $result; ?>

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

Очевиднее решить такую задачу через ифы:

<?php $num = 1; if ($num == 1 or $num == 2) { $result = 'a'; } if ($num == 3) { $result = 'b'; } echo $result; ?>