Примеры switch case в php

Примеры решения задач

Задача

Задача. Если переменная $a равна 10, то выведите ‘Верно’, иначе выведите ‘Неверно’.

Решение:

Задача

Задача. В переменной $min лежит число от 0 до 59. Определите в какую четверть часа попадает это число (в первую, вторую, третью или четвертую).

Решение:

Задача

Задача. Переменная $lang может принимать два значения: ‘ru’ и ‘en’. Если она имеет значение ‘ru’, то в переменную $arr запишем массив дней недели на русском языке, а если имеет значение ‘en’ – то на английском. Решите задачу через 2 if, через switch-case и через многомерный массив без ифов и switch.

Решение:

Решение через 2 if:

Решение через switch-case:

Решение через многомерный массив:

Proposal

In PHP 7.3 both the declaration of case-insensitive constants, as well as their access (with a name different from the declared one) will result in a deprecation warning:

define('FOO', 42, true); // Deprecated: define(): Declaration of case-insensitive constants is deprecated
var_dump(FOO); // Ok!
var_dump(foo); // Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "FOO"

The function is not affected. It will continue to return for case-insensitive constants, without generating a deprecation warning.

Declaration of case-insensitive constants by extensions will not generate a deprecation warning (though their access will). The reason behind this is that the end-user will not be able to do anything about this deprecation warning, while the extension maintainer may not be able to change the declaration for BC reasons at this point.

The reason why both declaration and access generate deprecation warnings is that both may generally fall into the responsibility of different maintainers. While accesses are performed by library users and can always be trivially fixed, definitions may be part of libraries that cannot immediately switch to case-sensitive constants due to backwards compatibility guarantees.

In PHP 8 the ability to declare case-insensitive constants will be removed.

Handling of true, false and null

, and in PHP are originally “ordinary” case-insensitive constants, though in practice they are subject to various special casing. For example, these constants are not subject to namespace fallback, as we must be able to resolve their values at compile-time.

, and are the only case-insensitive constants which are commonly used with a casing different from their declaration (which is , and ). In the mind of programmers not familiar with the details of the PHP implementation, these resemble keywords more than constants.

This RFC proposes to convert , and into proper reserved keywords in PHP 8 (reserved keywords are always case-insensitive). This has two implications with regard to backwards compatibility:

  • As , and are no longer constants, they will not be accessible through , etc. The names can also no longer be treated as namespaced names, such that and would become invalid.
  • , and can no longer be used as identifiers. They will remain legal method and class constant names, as these are not subject to reserved keyword restrictions. It should be noted that these symbols are already forbidden as class names and as (namespaced) global constant names, so effectively this means that only the use as a function name is additionally forbidden.

Конструкции выбора

Часто вместо нескольких расположенных подряд инструкций целесообразно воспользоваться специальной конструкцией выбора switch-case. Данная конструкция предназначена для выбора действий, в зависимости от значения указанного выражения. Конструкция switch-case чем-то напоминает конструкцию if-else, который, по сути, является ее аналогом. Конструкцию выбора можно использовать, если предполагаемых вариантов много, например, более 5, и для каждого варианта нужно выполнить специфические действия. В таком случае, использование конструкции if-else становится действительно неудобным.


Синтаксис конструкции switch-case такой:

Принцип работы конструкции switch-case такой:

  1. Вычисляется значение выражения;
  2. Просматривается набор значений. Пусть значение1 равно значению выражения, вычисленного на первом шаге. Если не указана конструкция (оператор) break, то будут выполнены команды i, i+1, i+2, … , N. В противном случае (есть break) будет выполнена только команда с номером i.
  3. Если ни одно значение из набора не совпало со значением выражения, тогда выполняется блок default, если он указан.

Приведем примеры использования конструкции switch-case:

Рассмотренный сценарий выводит x=1 дважды. Еще пример использования конструкции switch-case:

Данный скрипт выводит «Это Яблоко».

Конструкция switch выполняется поэтапно. Сперва никакой код не исполнен. Только, когда конструкция case найдена со значением, которое соответствует значению выражения switch, PHP начинает исполнять конструкции. PHP продолжает исполнять конструкции до конца блока switch, пока не встречается оператор break. Если не использовать конструкции (операторы) break, скрипт будет выглядеть так:

Операторный список для case может быть также пуст, он просто передает управление в операторный список до следующей конструкции case:

Когда ни одно значение из набора не совпало со значением выражения, тогда выполняется блок default, если он указан, например:


Данный скрипт выводит «x не равен 0, 1 или 2», поскольку переменная $x=3.

Конструкция switch-case также имеет альтернативный синтаксис:

Практический пример использования альтернативного синтаксиса для конструкции switch-case:

Как вы уже поняли, данный скрипт выводит «x не равен 0, 1 или 2», так как $x=3.

 <<< Назад (Циклы в PHP) 
 Вперед >>> (Конструкции объявления) 
Есть еще вопросы или что-то непонятно — добро пожаловать на наш  форум портала PHP.SU 
 

Конструкция if-else

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

То есть нам нужно иметь возможность спросить у JavaScript ‘Если’.

Например так: если эта переменная меньше нуля, то вывести ‘отрицательно’, иначе (то есть если она больше нуля) вывести ‘положительно’.

В JavaScript для таких вопросов предназначена конструкция if, которая позволяет выполнять определенный код при выполнении какого-либо условия:

Обратите внимание на то, что блок else не обязателен.

Логическое выражение представляет собой тот самый вопрос, который мы хотим задать JavaScript. Например, чтобы спросить ‘переменная a больше нуля’ мы напишем так: a > 0.

Примеры работы:

Описание конструкции PHP: switch case

Условие, которое проверяется, записывается в круглых скобках после ключевого слова ‘switch’. Тело конструкции состоит из секций ‘case’ и одного блока операторов ‘default’, который исполняется только в том случае, если не сработал ни один из блоков ‘case’.

Есть весьма существенный нюанс. Блок операторов ‘case’ начинается после символа ‘:’ и заканчивается оператором ‘break’. Наличие оператора ‘break’ — не обязательно. Если его нет, то будет проверено следующее условие ‘case’. Проверка условий выполняется всегда до первого совпадения. Естественно, условия здесь только ‘==’.

Каждая секция ‘case’ исполняется только в том случае, если условие выполняется, но блок операторов ‘default’ будет исполнен всегда, если есть пропуск оператора ‘break’ в той секции ‘case’, которая сработала, или ни одно из условий не совпало.

Фактически на PHP: switch case на несколько значений имеет несколько блоков операторов. Для формального следования синтаксису каждый блок операторов должен быть завершен ‘break’.


Как только произошло совпадение условия, исполняется соответствующая секция и, если в ней отсутствует ‘break’, все, что следует за ней. В примере значение переменной ‘$x’ равно 1 и нет ни одного ‘break’, поэтому результат = ‘-one—two—default-‘.

Introduction

PHP currently supports both case-sensitive and case-insensitive constants. Case-insensitive constants see very little practical use, are subject to various inconsistencies in functionality and cause undue implementational complexity. This RFC proposes to deprecate and remove case-insensitive constants.

The current state of the matter is:

  • Class constants are always case-sensitive.
  • Global constants declared with are always case-sensitive. It should be noted that this applies only to the shortname of the constant, while namespaces in PHP are always case-insensitive.
  • Constants declared with are case-sensitive by default.
  • It is possible to declare case-insensitive constants by passing as the third parameter of .

This RFC proposes to:

  • In PHP 7.3: Deprecate calling with third parameter .
  • In PHP 7.3: Deprecate accessing a case-insensitive constant with a casing that differs from the declaration-site. The constants , and are exempt from this.
  • In PHP 8.0: Remove the possibility of declaring case-insensitive constants.
  • In PHP 8.0: , and are converted from special-cased constants into reserved keywords.

Проблема с операторами в switch

Прежде, чем мы перейдем к обзору нововведений в switch, давайте быстро оценим одну ситуацию. Допустим, мы столкнулись с «ужасным» тернарным булеаном и хотим преобразовать его в обычный булеан. Вот один из способов сделать это:

Согласитесь, что это очень неудобно. Как и многие другие варианты switch, встречающиеся в «природе», представленный выше пример просто вычисляет значение переменной и присваивает его, но реализация обходная (объявляем идентификатор и используем его позже), повторяющаяся (мои ‘и всегда результат copy-pasta) и подвержена ошибкам (забыл еще одну ветку? Ой!). Тут явно есть, что улучшить.

Давайте попробуем решить эти проблемы, поместив switch в отдельный метод:

Так намного лучше: отсутствует фиктивная переменная, нет ‘ов, загромождающих код и сообщений компилятора об отсутствии (даже если в этом нет необходимости, как в данном случае).

Но, если подумать, то мы не обязаны создавать методы только для того, чтобы обойти неуклюжую особенность языка. И это даже без учёта, что такой рефакторинг не всегда возможен. Нет, нам нужно решение получше!

Практика

index.phpbootstrap.php

bootstrap.php

2.1. Реализация маршрутизатора URL

.htaccess

index.phproute.phpexample.ru/contacts/feedbackexplodecontactsfeedbackexample.com/portfolioexample.com/portfolio/index

  1. подключит файл model_portfolio.php из папки models, содержащий класс Model_Portfolio;
  2. подключит файл controller_portfolio.php из папки controllers, содержащий класс Controller_Portfolio;
  3. создаст экземпляр класса Controller_Portfolio и вызовет действие по умолчанию — action_index, описанное в нем.

example.com/ufoexample.com/404

2.2. Возвращаемся к реализации MVC

model.php, view.php и controller.phpmodel.php

view.php

generate

  1. $content_file — виды отображающие контент страниц;
  2. $template_file — общий для всех страниц шаблон;
  3. $data — массив, содержащий элементы контента страницы. Обычно заполняется в модели.

controller.php

action_index

  1. Главная
  2. Услуги
  3. Портфолио
  4. Контакты
  5. А также — страница «404»

template_view.php

controller_main.php

generatemain_view.php

  • example.com
  • example.com/main
  • example.com/main/index

2.3.2. Создадаем страницу «Портфолио»

  1. методы нативных библиотек pgsql или mysql;
  2. методы библиотек, реализующих абстракицю данных. Например, методы библиотеки PEAR MDB2;
  3. методы ORM;
  4. методы для работы с NoSQL;
  5. и др.

model_portfolio.php

controller_portfolio.php

dataget_datagenerateportfolio_view.php

Теория

  1. При заходе пользователя на веб-ресурс, скрипт инициализации создает экземпляр приложения и запускает его на выполнение. При этом отображается вид, скажем главной страницы сайта.
  2. Приложение получает запрос от пользователя и определяет запрошенные контроллер и действие. В случае главной страницы, выполняется действие по умолчанию (index).
  3. Приложение создает экземпляр контроллера и запускает метод действия, в котором, к примеру, содержаться вызовы модели, считывающие информацию из базы данных.
  4. После этого, действие формирует представление с данными, полученными из модели и выводит результат пользователю.

МодельВидКонтроллер

1.1. Front Controller и Page Controller

  1. www.example.com/article.php?id=3
  2. www.example.com/user.php?id=4
  1. www.example.com/index.php?article=3
  2. www.example.com/index.php?user=4

index.phpviewforum.phpviewtopic.phpindex.php

Задачи для решения

Работа с if-else

Если переменная $a равна нулю, то выведите ‘Верно’, иначе выведите ‘Неверно’. Проверьте работу скрипта при $a, равном 1, 0, -3.

Если переменная $a больше нуля, то выведите ‘Верно’, иначе выведите ‘Неверно’. Проверьте работу скрипта при $a, равном 1, 0, -3.

Если переменная $a меньше нуля, то выведите ‘Верно’, иначе выведите ‘Неверно’. Проверьте работу скрипта при $a, равном 1, 0, -3.

Если переменная $a больше или равна нулю, то выведите ‘Верно’, иначе выведите ‘Неверно’. Проверьте работу скрипта при $a, равном 1, 0, -3.

Если переменная $a меньше или равна нулю, то выведите ‘Верно’, иначе выведите ‘Неверно’. Проверьте работу скрипта при $a, равном 1, 0, -3.

Если переменная $a не равна нулю, то выведите ‘Верно’, иначе выведите ‘Неверно’. Проверьте работу скрипта при $a, равном 1, 0, -3.

Если переменная $a равна ‘test’, то выведите ‘Верно’, иначе выведите ‘Неверно’. Проверьте работу скрипта при $a, равном ‘test’, ‘тест’, 3.

Если переменная $a равна ‘1’ и по значению и по типу, то выведите ‘Верно’, иначе выведите ‘Неверно’. Проверьте работу скрипта при $a, равном ‘1’, 1, 3.

Работа с empty и isset

Если переменная $a пустая, то выведите ‘Верно’, иначе выведите ‘Неверно’. Проверьте работу скрипта при $a, равном 1, 3, -3, 0, null, true, », ‘0’.

Если переменная $a НЕ пустая, то выведите ‘Верно’, иначе выведите ‘Неверно’.

Если переменная $a существует, то выведите ‘Верно’, иначе выведите ‘Неверно’. Проверьте работу скрипта при $a, равном 3 и null.

Если переменная $a НЕ существует, то выведите ‘Верно’, иначе выведите ‘Неверно’.

Работа с логическими переменными

Если переменная $var равна true, то выведите ‘Верно’, иначе выведите ‘Неверно’. Проверьте работу скрипта при $var, равном true, false. Напишите два варианта скрипта — с короткой записью и с длинной.

Если переменная $var НЕ равна true, то выведите ‘Верно’, иначе выведите ‘Неверно’. Проверьте работу скрипта при $var, равном true, false. Напишите два варианта скрипта — с короткой записью и с длинной.

Работа с OR и AND

Если переменная $a больше нуля и меньше 5-ти, то выведите ‘Верно’, иначе выведите ‘Неверно’. Проверьте работу скрипта при $a, равном 5, 0, -3, 2.

Если переменная $a равна нулю или равна двум, то прибавьте к ней 7, иначе поделите ее на 10. Выведите новое значение переменной на экран. Проверьте работу скрипта при $a, равном 5, 0, -3, 2.

Если переменная $a равна или меньше 1, а переменная $b больше или равна 3, то выведите сумму этих переменных, иначе выведите их разность (результат вычитания). Проверьте работу скрипта при $a и $b, равном 1 и 3, 0 и 6, 3 и 5.

Если переменная $a больше 2-х и меньше 11-ти, или переменная $b больше или равна 6-ти и меньше 14-ти, то выведите ‘Верно’, в противном случае выведите ‘Неверно’.

На switch-case

Переменная $num может принимать одно из значений: 1, 2, 3 или 4. Если она имеет значение ‘1’, то в переменную $result запишем ‘зима’, если имеет значение ‘2’ – ‘лето’ и так далее. Решите задачу через switch-case.

Задачи

В переменной $day лежит какое-то число из интервала от 1 до 31. Определите в какую декаду месяца попадает это число (в первую, вторую или третью).

В переменной $month лежит какое-то число из интервала от 1 до 12. Определите в какую пору года попадает этот месяц (зима, лето, весна, осень).

В переменной $year хранится год. Определите, является ли он високосным (в таком году есть 29 февраля). Год будет високосным в двух случаях: либо он делится на 4, но при этом не делится на 100, либо делится на 400. Так, годы 1700, 1800 и 1900 не являются високосными, так как они делятся на 100 и не делятся на 400. Годы 1600 и 2000 — високосные, так как они делятся на 400.

Дана строка с символами, например, ‘abcde’. Проверьте, что первым символом этой строки является буква ‘a’. Если это так — выведите ‘да’, в противном случае выведите ‘нет’.

Дана строка с цифрами, например, ‘12345’. Проверьте, что первым символом этой строки является цифра 1, 2 или 3. Если это так — выведите ‘да’, в противном случае выведите ‘нет’.

Дана строка из 3-х цифр. Найдите сумму этих цифр. То есть сложите как числа первый символ строки, второй и третий.

Дана строка из 6-ти цифр. Проверьте, что сумма первых трех цифр равняется сумме вторых трех цифр. Если это так — выведите ‘да’, в противном случае выведите ‘нет’.

break

Если должен быть выполнен только один блок кода, соответствующий определенному значению, то в конце этого блока следует вставить ключевое слово . Интерпретатор PHP, встретив ключевое слово , завершает работу оператора и переходит к исполнению инструкции, расположенной после закрывающей фигурной скобки оператора .

Конструкции в операторе задают только начальную точку выполняемого программного кода, но не задают никаких конечных точек. В случае отсутствия ключевого слова , оператор начнёт выполнение блока кода с метки (), значение которой соответствует значению условного выражения, и продолжит выполнение инструкций до тех пор, пока не дойдет до конца всего блока. Поэтому стоит быть аккуратнее и не забывать завершать каждый блок оператором . В следующем примере показано, что происходит при отсутствии ключевого слова :

<?php
  $action = 'JUMP';

  switch ($action) {
    case 'JUMP':
      echo "Мне нравится прыгать.<br>";
    case 'SWEEM':
      echo "Я люблю плавать.<br>";
    case 'FLY':
      echo "Хотел бы я научиться летать.<br>";
  }

?>

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

<?php
  
  $a1 = 2;

  switch ($a1) {
    case 1:                            
    case 2:
    case 3:                                                        
      echo "\$a1 равно 1, 2 или 3";  
      break;
    case 6:                            
      echo "\$a1 равно 6";   
      break;
  }

?>

Обратите внимание на этот пример: список инструкций для выполнения в секции может быть пустым, в этом случае управление просто передается далее по списку — следующему оператору

JS Учебник

JS ГлавнаяJS ВведениеJS УстановкаJS ВыводJS СинтаксисJS ЗаявленияJS КомментарииJS ПеременныеJS ОператорыJS АрифметикаJS ПрисваиванияJS Типы данныхJS ФункцииJS ОбъектыJS ОбластьJS СобытияJS СтрокиJS Методы строкJS ЧислаJS Методы чиселJS МассивыJS Методы массиваJS Сортировка массиваJS Итерация массиваJS ДатыJS Формат датыJS Метод получения датJS Методы набора…JS Математические…JS Случайные числаJS БулевыJS Сравнение…JS Заявления if…elseJS Заявление switchJS Цикл forJS Цикл whileJS Заявление break…JS Преобразование…JS Битовые…JS Регулярные выраженияJS ОшибкиJS ОтладчикJS ПодъемныйJS СтрогийJS Ключевое слово thisJS Руководство стиляJS ПрактикаJS Распространенные ошибкиJS ЭффективностьJS Зарезервированные словаJS ВерсииJS Версия ES5JS Версия ES6JS JSON

Выражение CASE – условный оператор языка SQL

Первая форма: Вторая форма:
CASE WHEN условие_1 THEN возвращаемое_значение_1 … WHEN условие_N THEN возвращаемое_значение_N END CASE проверяемое_значение WHEN сравниваемое_значение_1 THEN возвращаемое_значение_1 … WHEN сравниваемое_значение_N THEN возвращаемое_значение_N END

Разберем на примере первую форму CASE:

ID Name Salary SalaryTypeWithELSE SalaryTypeWithoutELSE
1000 Иванов И.И. 5000 ЗП >= 3000 ЗП >= 3000
1001 Петров П.П. 1500 ЗП < 2000 NULL
1002 Сидоров С.С. 2500 2000 <= ЗП < 3000 2000 <= ЗП < 3000
1003 Андреев А.А. 2000 2000 <= ЗП < 3000 2000 <= ЗП < 3000
1004 Николаев Н.Н. 1500 ЗП < 2000 NULL
1005 Александров А.А. 2000 2000 <= ЗП < 3000 2000 <= ЗП < 3000

Разберем на примере вторую форму CASE:

  • Сотрудникам ИТ-отдела выдать по 15% от ЗП;
  • Сотрудникам Бухгалтерии по 10% от ЗП;
  • Всем остальным по 5% от ЗП.
ID Name Salary DepartmentID NewYearBonusPercent BonusAmount
1000 Иванов И.И. 5000 1 5% 250
1001 Петров П.П. 1500 3 15% 225
1002 Сидоров С.С. 2500 2 10% 250
1003 Андреев А.А. 2000 3 15% 300
1004 Николаев Н.Н. 1500 3 15% 225
1005 Александров А.А. 2000 NULL 5% 100
  • Первым делом ЗП должны получить сотрудники у кого оклад меньше 2500
  • Те сотрудники у кого оклад больше или равен 2500, получают ЗП во вторую очередь
  • Внутри этих двух групп нужно упорядочить строки по ФИО (поле Name)
ID Name Salary
1005 Александров А.А. 2000
1003 Андреев А.А. 2000
1004 Николаев Н.Н. 1500
1001 Петров П.П. 1500
1000 Иванов И.И. 5000
1002 Сидоров С.С. 2500
ID Name Salary DepartmentID NewYearBonusPercent1 NewYearBonusPercent2
1000 Иванов И.И. 5000 1 5% 5%
1001 Петров П.П. 1500 3 15% 15%
1002 Сидоров С.С. 2500 2 10% 10%
1003 Андреев А.А. 2000 3 15% 15%
1004 Николаев Н.Н. 1500 3 15% 15%
1005 Александров А.А. 2000 NULL 5%

С этим читают