Php switch get case
Конструкция switch..case является альтернативой использованию конструкции if..elseif..else . Оператор switch получает некоторое выражение и сравнивает его с набором значений:
После ключевого слова switch в скобках идет сравниваемое выражение. Значение этого выражения последовательно сравнивается со значениями, помещенными после операторов сase . И если совпадение будет найдено, то будет выполняться определенный блок сase.
Конструкция switch может содержать произвольное количество операторов case. В конце блока сase ставится оператор break , чтобы избежать выполнения других блоков.
Весь блок switch помещается в фигурные скобки, однако блок каждого отдельного оператора case НЕ помещается в фигурные скобки.
Например, возьмем следующую конструкцию if..elseif..else :
$a = 3; if($a==1) echo "сложение"; elseif($a==2) echo "вычитание"; elseif($a==3) echo "умножение"; elseif($a==4) echo "деление";
Теперь перепишем ее с помощь конструкции switch..case :
То есть на вход в конструкцию switch передается переменная $a , и ее значение последовательно сравнивается со значениями, указанными после операторов case . Так, в данном случае переменная $a равна 3, поэтому выполнение дойдет до блока
case 3: echo "умножение"; break;
и этот блок и будет выполняться.
Если мы хотим также обработать ситуацию, когда совпадения не будет найдено, то можно добавить блок default :
Конструкция switch..case также поддерживает альтернативный синтаксис, при котором вместо открывающей блок фигурной скобки ставится двоеточие, а вместо закрывающей фигурной скобки — ключевое слово endswitch :
$a = 3; switch($a): case 1: echo "сложение"; break; case 2: echo "вычитание"; break; default: echo "действие по умолчанию"; break; endswitch
match
Начиная с версии 8.0 в PHP была добавлена поддержка другой, похожей конструкции — match . Она позволяет оптимизировать конструкцию switch . Конструкция match также принимает некоторое выражение и сравнивает его с набором значений.
Например, пусть у нас есть следующий код:
$a = 2; switch($a) < case 1: $operation = "сложение"; break; case 2: $operation = "вычитание"; break; default: $operation = "действие по умолчанию"; break; >echo $operation;
Перепишем этот пример с использованием match :
$a = 2; $operation = match($a) < 1 =>"сложение", 2 => "вычитание", default => "действие по умолчанию", >; echo $operation;
Итак, match в скобках также принимает некоторое сравниваемое выражение (в данном случае это переменная $a). Сам блок кода match также обертывается в фигурные скобки, однако в конце после закрывающей фигурной скобки необходимо поставить точку с запятой. А вместо операторов case просто указываются значения, с которыми сравнивается выражение.
Но в отличие от switch , конструкция match возвращает некоторый результат. Поэтому после каждого сравнимого значения ставится оператор => , после которого идет возвращаемый результат.
То есть в данном случае переменная $a равна 2, поэтому в конструкции match будет выполнять блок
Этот блок установит в качестве возвращаемого результата строку «вычитание» .
Поскольку конструкция match возвращает результат, то этот результат мы можем присвоить другой переменной:
В итоге в переменной $operation будет храниться строка «вычитание» .
Также мы можем переписать предыдущий пример следующим образом:
$a = 2; match($a) < 1 =>$operation = "сложение", 2 => $operation = "вычитание", default => $operation = "действие по умолчанию", >; echo $operation;
Сравнение значений и типов
Стоит отметить важное отличие конструкции switch от match : switch сравнивает только значение, но не учитывает тип выражения. Тогда как match также учитывает тип сравниваемого выражения. Рассмотрим разницу на примере. Пусть есть следующая конструкция switch:
switch (8.0) < case "8.0": $result = "строка"; break; case 8.0: $result = "число"; break; >echo $result; // строка
В конструкцию switch передается в качестве выажения число 8.0, но с точки зрения внутренней логики конструкции switch это выражение также соответствует строке «8.0». Поэтому в данном случае будет выполняться блок
case "8.0": $result = "строка"; break;
Теперь посмотрим, что будет в аналогичном примере с match:
match (8.0) < "8.0" =>$result = "строка", 8.0 => $result = "число" >; echo $result; // число
Конструкция match также будет учитывать тип выражения, а тип в данном случае float, поэтому будет выполняься блок:
Php switch get case
Оператор switch похож на ряд операторов IF с одинаковым условием. Во многих случаях вам может понадобиться сравнивать одну и ту же переменную (или выражение) с множеством различных значений и выполнять различные участки кода в зависимости от того, какое значение принимает эта переменная (или выражение). Это именно тот случай, для которого удобен оператор switch .
Замечание: Обратите внимание, что в отличие от некоторых других языков, оператор continue применяется в конструкциях switch и действует подобно оператору break . Если у вас конструкция switch находится внутри цикла, и вам необходимо перейти к следующей итерации цикла, используйте continue 2 .
Замечание:
Заметьте, что конструкция switch/case использует нестрогое сравнение (==).
В следующем примере каждый блок кода эквивалентен. В одном используется серия операторов if и elseif , а в другом — оператор switch . В каждом случае результат один и тот же.
Пример #1 Оператор switch
switch ( $i ) case 0 :
echo «i равно 0» ;
break;
case 1 :
echo «i равно 1» ;
break;
case 2 :
echo «i равно 2» ;
break;
>
if ( $i == 0 ) echo «i равно 0» ;
> elseif ( $i == 1 ) echo «i равно 1» ;
> elseif ( $i == 2 ) echo «i равно 2» ;
>
?>
Пример #2 Оператор switch допускает сравнение с типом string
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
Замечание: Несколько указаний default вызовут ошибку E_COMPILE_ERROR .
Замечание: Формально конструкция default может быть перечислена в любом месте. Она будет использоваться только в том случае, если ни один другой вариант не подходит. Однако, по соглашению, лучше всего поместить её в конец, как последнюю конструкцию.
Если ни одна конструкция case не совпадает и нет конструкции default , то код не будет выполнен, как если бы ни одно утверждение if не было истинным.
Значение case может быть задано в виде выражения. Однако это выражение будет оценено само по себе, а затем слабо сопоставлено со значением switch. Это означает, что его нельзя использовать для сложных оценок значения switch. Например:
switch ( $target ) case $start — 1 :
print «A» ;
break;
case $start — 2 :
print «B» ;
break;
case $start — 3 :
print «C» ;
break;
case $start — 4 :
print «D» ;
break;
>
Для более сложных сравнений в качестве значения switch может использоваться значение true . Или, как вариант, вместо switch использовать блоки if — else .
switch ( true ) case $start — $offset === 1 :
print «A» ;
break;
case $start — $offset === 2 :
print «B» ;
break;
case $start — $offset === 3 :
print «C» ;
break;
case $start — $offset === 4 :
print «D» ;
break;
>
Возможен альтернативный синтаксис для управляющей структуры switch. Для более детальной информации, смотрите Альтернативный синтаксис для управляющих структур.
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» ;
endswitch;
?>?php
Возможно использование точки с запятой вместо двоеточия после оператора case. К примеру :
switch( $beer )
case ‘tuborg’ ;
case ‘carlsberg’ ;
case ‘stella’ ;
case ‘heineken’ ;
echo ‘Хороший выбор’ ;
break;
default;
echo ‘Пожалуйста, сделайте новый выбор. ‘ ;
break;
>
?>?php
Оператор switch в PHP
Оператор switch аналогичен серии операторов if с одинаковым условием. Часто возникает необходимость сравнивать одну и ту же переменную или выражение с массой различных значений, и выполнять разные сценарии в зависимости от того, какое значение принимает эта переменная или выражение. Это именно та ситуация, для которой удобен оператор switch .
Используйте оператор switch , чтобы выбрать один из множества блоков кода для выполнения.
Синтаксис
switch (n) <
case label1:
// код для выполнения, если n=label1
break;
case label2:
// код для выполнения, если n=label2
break;
.
default :
// код, выполняемый, если n отличается от всех меток labels
>
Вот как работает оператор switch : берется исходное выражение n (чаще всего переменная), которое вычисляется один раз. Затем значение выражения сравнивается со всеми значениями, стоящими рядом с ключевым словом case (метка), в порядке их следования. Если есть совпадение, выполняется блок кода, связанный с этим случаем. Используйте break для предотвращения автоматического перехода кода к следующей метке. Оператор default используется, если совпадение не найдено.
Пример
$i = "яблоко";
switch ($i) case "яблоко":
echo "i это яблоко";
break;
case "груша":
echo "i это груша";
break;
case "слива":
echo "i это слива";
break;
default:
echo "i это не яблоко, не груша и не слива";
>
?>
Результат выполнения кода:
Примечание: Обратите внимание, что за ключевым словом case каждый раз следует значение (литерал), после которого должно обязательно стоять двоеточие.
break
Инструкции, расположенные после case , будут исполняться до тех пор, пока не встретится оператор break .
Интерпретатор PHP, встретив ключевое слово break , завершает работу оператора switch и переходит к исполнению инструкции, расположенной после закрывающей фигурной скобки оператора switch .
Если вы не напишете оператор break , оператор switch начнёт выполнение блока кода с case метки, значение которой соответствует значению условного выражения, и продолжит выполнение инструкций до тех пор, пока не дойдет до конца всего блока. В следующем примере показано, что происходит при отсутствии ключевого слова break :
Пример
$i = 0;
switch ($i) case 0:
echo "i равно 0";
case 1:
echo "i равно 1";
case "2":
echo "i равно 2";
default:
echo "i это не 0, не 1 и не 2";
>
?>
Примечание: В операторе case может быть использовано любое выражение, которое приводится к простому типу, то есть к строке ( string ), числу ( integer ), вещественному числу ( float ) или логическому значению ( bool ). Массивы или объекты не используются.
continue
Оператор continue применяется в конструкциях switch и действует подобно оператору break :
Пример
$a1 = 2;
switch ($a1) case 1:
case 2:
case 3:
echo "\$a1 равно 1, 2 или 3"; //выведет $a1 равно 1, 2 или 3
continue;
case 6:
echo "\$a1 равно 6";
continue;
>
?>
Результат выполнения кода:
Из примера выше видно, что список операторов для исполнения в секции case также может быть пустым, что просто передает управление списку операторов в следующей секции case .
Примечание: Заметьте, что конструкция swich/case использует неточное сравнение (==).