PHP switch
Summary: in this tutorial, you will learn about the PHP switch statement that executes a code block by matching an expression with multiple values.
Introduction to the PHP switch statement
When the value of a single variable determines the number of different choices, you can use the if. elseif statement.
Suppose that you’re building a website whose users have many roles like admin, editor, author, and subscriber.
The following example uses an if elseif statement to display a different message based on the role of the user:
$role = 'subscriber'; $message = ''; if ('admin' === $role) < $message = 'Welcome, admin!'; > elseif ('editor' === $role) < $message = 'Welcome! You have some pending articles to edit'; > elseif ('author' === $role) < $message = 'Welcome! Do you want to publish the draft article?'; > elseif ('subscriber' === $role) < $message = 'Welcome! Check out some new articles.'; > else < $message = 'Sorry! You are not authorized to access this page'; > echo $message;
Code language: HTML, XML (xml)
Welcome! Check out some new articles.
Code language: JavaScript (javascript)
When the value of a single variable specifies the number of different choices, it’s much cleaner to use the switch statement like this:
$role = 'admin'; $message = ''; switch ($role) < case 'admin': $message = 'Welcome, admin!'; break; case 'editor': $message = 'Welcome! You have some pending articles to edit'; break; case 'author': $message = 'Welcome! Do you want to publish the draft article?'; break; case 'subscriber': $message = 'Welcome! Check out some new articles.'; break; default: $message = 'You are not authorized to access this page'; > echo $message;
Code language: HTML, XML (xml)
The following illustrates the syntax of the switch statement:
switch (expression) < case value1: // code block 1 break; case value2: // code block 2 break; case value3: // code block 3 break; default: // default code block >
Code language: HTML, XML (xml)
The switch statement compares an expression with the value in each case.
If the expression equals a value in a case, e.g., value1 , PHP executes the code block in the matching case until it encounters the first break statement.
If there’s no match and the default is available, PHP executes all statements following the default keyword.
In case the default is not specified, and there’s no match, the control is passed to the statement that follows the switch statement.
The following flowchart illustrates how the switch statement works:
Combining cases
Since PHP executes the switch statement from the matching case label till it encounters the break statement, you can combine several cases in one.
The following example uses the switch statement and combines the cases of ‘editor’ and ‘author’ :
$message = ''; $role = 'author'; switch ($role) < case 'admin': $message = 'Welcome, admin!'; break; case 'editor': case 'author': $message = 'Welcome! Do you want to create a new article?'; break; case 'subscriber': $message = 'Welcome! Check out some new articles.'; break; default: $message = 'You are not authorized to access this page'; > echo $message;
Code language: HTML, XML (xml)
Welcome! Do you want to create a new article?
Code language: PHP (php)
In this example, if the role is editor or author, it’ll show the same message.
PHP switch statement’s alternative syntax
PHP also supports the alternative syntax for the switch statement as follows:
switch (expression): case value1: // code block 1 break; case value2: // code block 2 break; default: // default code block break; endswitch;
Code language: HTML, XML (xml)
The alternative syntax is suitable for mixing with the HTML code.
Summary
Switch case for php
Конструкция 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, поэтому будет выполняься блок:
Примеры switch case в PHP
Конструкция switch-case очень похожа на условный оператор if-else, но имеет свои особенности. Целесообразнее использовать именно switch-case, когда выбор среди сравниваемых значений, предстоит сделать из большего количества вариантов.
Пример 1
Представим ситуацию, что вам заказали написать часть программы для прохождения онлайн теста по географии. Участники должны предложить свой вариант и в зависимости от ответа выведется на экран та или иная надпись.
Вопрос: Назовите страну из первой тройки с самой большой численностью населения?
$pop =»Китай»; //значение переменной
switch ($pop) < //условный оператор
case «Китай»://ключевое слово
echo «Китай занимает первое место»; //вывод на экран
break;
case «Индия»:
echo «Индия занимает второе место»;
break;
case «США»:
echo «США занимают третье место»;
break; //оператор переходит к default
default:
echo «Вам надо подучить географию.»;
>
?>
Как работает оператор switch?
Когда участник введёт слово, например Китай, это слово запишется в переменную $pop, оператор switch пройдется по меткам (case) по порядку, пока значение переменной не совпадет с одним из значений кейса, тогда на экран выведется: Китай занимает первое место. Но если участник введет, например слово Россия, которого нет в коде программы, то switch, не обнаружив совпадений, наткнется на break и перейдет к выполнению дефолтным инструкций, выведет на экран: Вам надо подучить географию.
Break не обязателен
Если предусмотрено выполнение только одного кейса, то в конце case обязательно должно стоять ключевое слово break, которое прерывает работу оператора switch, как только значение будет найдено или не найдено (ничего не выведет на экран или дефолтное сообщение).
Давайте посмотрим на примере, что произойдет, если в скрипте после case не будет ключевого слова break.
Пример 2
Рассмотрим на примере сказки Репка, мы уже забыли в каком порядке персонажи сказки тянут друг за другом репку.
$repka = «мышка»;
switch ($repka) case «мышка»: echo «Мышка за кошку»;
case «кошка»: echo «Кошка за жучку»;
case «жучка»: echo «Жучка за внучку»;
case «внучка»: echo «Внучка за бабку»;
case «бабка»: echo «Бабка за дедку»;
case «дедка»: echo «Дедка за репку»;
>
?>
В переменной $repka оказалась мышка, оператор switch обнаружил мышку и ничто ему не мешает перебрать все кейсы и вывести их значения по порядку. Выполняются все кейсы, идущие следом за совпадающими значениями.
Мышка за кошку
Кошка за жучку
Жучка за внучку
Внучка за бабку
Бабка за дедку
Дедка за репку
Но когда в переменную попадает дедка, то на экран выведется только последний кейс.
Пример 3
Пример, когда в кейсах нет инструкций для выполнения, но зато есть инструкция в последнем, тогда выполняется последняя инструкция.
$cheese = ‘Камамбер’;
switch ($cheese) case ‘Пармезан’;
case ‘Моцарелла’;
case ‘Камамбер’;
echo ‘Вы настоящий гурман’;
break;
default;
echo ‘У вас непритязательный вкус.’;
break;
>
?>
Пример, классической манипуляции, пользователь вводит любой сорт сыра из кейсов, то ему на экране выводится приятное сообщение Вы настоящий гурман. Если пользователь введет название какого-нибудь дешевого сыра, то увидит обидное сообщение – У вас непритязательный вкус.
Выводы
Когда же лучше использовать конструкцию switch-case, если if-else, делает тоже самое. Используйте оператор switch, когда надо сравнивать больше, чем два значения или ваше условие сложнее, чем простое сравнение.
Создано 22.03.2019 10:37:00
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 0 ):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.