Verification: a143cc29221c9be0

Php case для нескольких значений

Php case для нескольких значений

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

Конструкция выбора switch case PHP очень просто записывается, корректно исполняется и удобна на практике. В примере предложена функция, которая оформляет текст тегами HTML. Если первый параметр содержит "bold" или "italic", то результат функции оборачивает второй параметр тегами "strong" или "i".

Результат в браузере отображает содержание второго параметра жирным или наклонным начертанием. Любое другое значение первого параметра интерпретируется как цвет и оборачивает второй параметр тегом "font".

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

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

Описание конструкции 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-".

Вложенность условных конструкций

Язык не ограничивает разработчика в уровне вложенности. Допускается вкладывать switch case. PHP также не ограничивает программиста в выборе операторов, которые можно использовать внутри case.

Это позволяет делать красивые и легко читаемые алгоритмы. Например, необходимо распознать таблицу правил CSS. Можно сразу установить switch case PHP на распознавание классов и идентификаторов, затем распознавать сами правила. Это очевидное решение, но громоздкое. Как классы, так и идентификаторы используют сходные правила.

Удобнее выполнить распознавание правил посредством switch case. Можно в PHP включить функцию, которая будет обращаться к распознаванию правил. Можно пойти дальше. Многие правила допускают сходные значения. Рассуждая таким образом, попробуйте построить обратный процесс: switch case на PHP будет исполнена в виде функций, первая работает на уровне значений, вторая - на уровне правил, а третья вызывается с уровня конкретного класса или идентификатора.

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

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

switch(выражение) {

case значение2: команды2;
. . .

}

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

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

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

php
$ x = 1 ;
// Используем if-else
if ($ x == 0 ) {
echo "x=0
" ;
} elseif ($ x == 1 ) {
echo "x=1
" ;
} elseif ($ x == 2 ) {
echo "x=2
" ;
}
// Используем switch-case
switch ($ x ) {
case 0 :
echo "x=0
" ;
break;
case 1 :
echo "x=1
" ;
break;
case 2 :
echo "x=2
" ;
break;
}
?>

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

php
$ x = "Яблоко" ;
switch ($ x ) {
case "Яблоко" :
echo "Это Яблоко" ;
break;
case "Груша" :
echo "Это Груша" ;
break;
case "Арбуз" :
echo "Это Арбуз" ;
break;
}
?>

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

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

php
$ x = 0 ;
switch ($ x ) {
case 0 :
echo "x=0
" ;
case 1 :
echo "x=1
" ;
case 2 :
echo "x=2
" ;
}
// Без использования break выводит
// x=0
// x=1
// x=2
?>

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

switch ($x ) {
case 0 :
case 1 :
case 2 :
echo "x меньше, чем 3, но не отрицателен" ;
break;
case 3 :
echo "x=3" ;
}
?>

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

php
$ x = 3 ;
switch ($ x ) {
case 0 :
echo "x=0" ;
break;
case 1 :
echo "x=1" ;
break;
case 2 :
echo "x=2" ;
break;
default:
echo "x не равен 0, 1 или 2" ;
}
?>

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

switch(выражение):
case значение1: команды1;
. . .
case значениеN: командыN;
]
endswitch;

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

php
$ x = 3 ;
switch ($ x ):
case 0 :
echo "x=0" ;
break;
case 1 :
echo форум портала PHP . SU

На уроке будут рассмотрены условные операторы php: оператор if и оператор переключения switch

Условные операторы php представлены тремя основными конструкциями:

  • оператор условия if ,
  • оператор переключения switch
  • и тернарный оператор .

Рассмотрим подробнее каждый из них.

PHP оператор if

Рис 3.1. Условный оператор IF, укороченный вариант

Рис. 3.2. Синтаксис условного оператора IF ELSE

Рис. 3.3. Полный синтаксис условного оператора IF elseif

Подытожим:

Полный синтаксис:

if (условие) { // если условие истинно operator1; operator2; } elseif(условие) { operator1; ... } else { // если условие ложно operator1; operator2; }

  • Укороченный синтаксис может не содержать части конструкции с else и не содержать дополнительного условия elseif
  • Вместо служебного слова elseif можно писать else if (отдельно)
  • В одной конструкции if может быть несколько elseif . Будет выполнено первое встретившееся выражение elseif равное TRUE .
  • В случае наличия альтернативного условия elseif конструкция else должна идти последней в синтаксисе.

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

Рис. 3.4. Условный оператор If и Endif в php

Пример:

if($x > $y): echo $x." больше, чем ".$y; elseif($x == $y): // при использовании ":" нельзя писать раздельно else if echo $x." равно ".$y; else: echo $x." не > и не = ".$y; endif;

Важно: При использовании в конструкции двоеточия вместо фигурных скобок elseif нельзя писать в два слова!

Логические операции в условии

В условии if в скобках могут присутствовать следующие операции:

Пример: проверить значение числовой переменной: если оно меньше либо равно 10, — выдавать сообщение «число меньше или равно 10» , в обратном случае выдавать сообщение «число больше 10»

Решение:

$number=15; if ($number

Блоки php кода можно разрывать, рассмотрим пример:

Пример: Выводить на экран html-код «а равно 4» , если переменная $a действительно равна 4

1 Решение:

2 Решение:

A равно 4

Задание php 3_1: Выводить перевод цветов с английского языка на русский, проверяя значение переменной (в которой присвоен цвет: $a="blue")

Задание php 3_2: Найти максимальное из трех чисел

Операции сравнения и правило лжи

В конструкции if в скобках должно находиться логическое выражение или переменная, которые рассматриваются с точки зрения алгебры логики, возвращающая значения либо true либо false

Т.е. в качестве условия может выступать единственная переменная. Рассмотрим пример:

1 2 3 4 $a = 1 ; if ($a ) { echo $a ; }

$a=1; if ($a) { echo $a; }

В примере транслятор языка php будет рассматривать переменную в скобках на правило лжи:

Правило ЛЖИ или что считается ложным:

  • логическое False
  • целый ноль (0 )
  • действительный ноль (0.0 )
  • пустая строка и строка «0»
  • массив без элементов
  • объект без переменных
  • специальный тип NULL

Таким образом, в рассмотренном примере переменная $a равна единице, соответственно условие будет истинным и оператор echo $a; выведет на экран значение переменной.

Задание php 3_3: дана переменная а со строковым значением. Если а равна имени, то выводить «Привет, имя!» , если а равна пустому значению, то выводить «Привет, незнакомец!»

Логические конструкции И ИЛИ и НЕ в условном операторе

  1. Иногда необходимо предусмотреть выполнение одновременно нескольких условий. Тогда условия соединяются логическим оператором И — && :
  2. $a=1; if ($a>0 || $a>1) { echo "a > 0 или a > 1"; }

  3. Для указания ложности условия используется логический оператор НЕ — ! :
  4. 1 2 3 4 $a = 1 ; if (! ($a

    $a=1; if (!($a

Оператор Switch PHP

Оператор switch или «переключатель» заменяет несколько подряд идущих конструкций if . При этом он сравнивает одну переменную с множеством значений. Таким образом, это наиболее удобное средство для организации мультиветвления .

Синтаксис:

1 2 3 4 5 6 7 8 9 10 switch ($переменная ) { case "значение1" : оператор1 ; break ; case "значение2" : оператор2 ; break ; case "значение3" : оператор3 ; break ; [ default : оператор4 ; break ; ] }

switch($переменная){ case "значение1": оператор1; break; case "значение2": оператор2; break; case "значение3": оператор3; break; }

  • Оператор может проверять как строковые значения (тогда они указываются в кавычках), так и числовые (без кавычек).
  • Оператор break в конструкции обязателен. Он осуществляет выход из конструкции при истинном условии и выполнении соответствующего условию оператора. Без break будут выполняться операторы всех case независимо от их истинности.

Рис. 3.5. Условный оператор Switch

Пример: задан массив с полными мужскими именами. Проверять первый элемент массива и в зависимости от имени, выдавать приветствие с коротким именем.

Решение:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $names = array ("Иван" , "Петр" , "Семен" ) ; switch ($names [ 0 ] ) { case "Петр" : echo "Привет, Петя!" ; break ; case "Иван" : echo "Привет, Ваня!" ; break ; case "Семен" : echo "Привет, Ваня!" ; break ; default : echo "Привет, $names !" ; break ; }

$names=array("Иван","Петр","Семен"); switch($names){ case "Петр": echo "Привет, Петя!"; break; case "Иван": echo "Привет, Ваня!"; break; case "Семен": echo "Привет, Ваня!"; break; default: echo "Привет, $names!"; break; }

Задание php 3_4:

  • Создайте переменную $day и присвойте ей произвольное числовое значение
  • С помощью конструкции switch выведите фразу «Это рабочий день» , если значение переменной $day попадает в диапазон чисел от 1 до 5 (включительно)
  • Выведите фразу «Это выходной день» , если значение переменной $day равно числам 6 или 7
  • Выведите фразу «Неизвестный день» , если значение переменной $day не попадает в диапазон чисел от 1 до 7(включительно)

Дополните код:

1 2 3 4 5 6 7 8 9 10 11 12 ... switch (... ) { case 1 : case 2 : ... echo "Это рабочий день" ; break ; case 6 : ... default : ... }

Switch(...){ case 1: case 2: ... echo "Это рабочий день"; break; case 6: ... default: ... }

Тернарный оператор PHP

Тернарный оператор , т.е. с тремя операндами, имеет достаточно простой синтаксис, в котором слева от знака? записывается условие, а справа — два оператора разделенные знаком: , слева от знака выполняется оператор при истинности условия, а справа от знака: выполняется оператор при ложном условии.

условие? оператор1 : оператор2 ;

Оператор 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"; } 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; }

Важно понять, как оператор 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"; }

В этом примере, если $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"; }

Специальный вид конструкции 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"; }

Выражением в операторе 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;

Возможно использование точки с запятой вместо двоеточия после оператора case. К примеру:

Switch($beer) { case "tuborg"; case "carlsberg"; case "heineken"; echo "Хороший выбор"; break; default; echo "Пожалуйста, сделайте новый выбор..."; break; }

Оператор switch является аналогом конструкции IF ELSEIF ELSE и позволяет выполнять различные действия в зависимости от значения.

В следующем коде можно увидеть, как одну и ту же задачу можно решить с помощью if и switch:

Конструкция switch использует нестрогое сравнение == .

В круглые скобки мы помещаем значение, которое будет сравниваться с остальными. Затем идёт case , сравниваемое значение и двоеточие. Затем идут команды, которые нужно выполнить. Блок default выполнится, если не выполнен ни один блок case.

Команда break прерывает текущее выполнение switch. Дело в том, что switch выполняет все команды подряд, даже если они находятся в разных блоках case:

"; case 2: echo "Статус: Передан в доставку
"; break; case 3: echo "Статус: Выполнен
"; break; } ?>

Результат в браузере:

Статус: Обрабатывается Статус: Передан в доставку

Как видите, выполнились 2 блока case. 1-ый - потому что подходит по условию, второй - потому что в 1-ом блоке отсутствует break.

Синтаксис

-- Syntax for SQL Server, Azure SQL Database and Azure Synapse Analytics
  
--Simple CASE expression:   
CASE input_expression   
     WHEN when_expression THEN result_expression [ ...n ]   
     [ ELSE else_result_expression ]   
END   

--Searched CASE expression:  
CASE  
     WHEN Boolean_expression THEN result_expression [ ...n ]   
     [ ELSE else_result_expression ]   
END  
-- Syntax for Parallel Data Warehouse  
  
CASE  
     WHEN when_expression THEN result_expression [ ...n ]   
     [ ELSE else_result_expression ]   
END

Аргументы

input_expression
Выражение, полученное при использовании простого формата функции CASE. input_expression — это любое допустимое выражение.

WHEN when_expression
Простое выражение, с которым сравнивается input_expression при использовании простого формата CASE. when_expression — это любое допустимое выражение. Типы данных аргумента input_expression и каждого из выражений when_expression должны быть одинаковыми или неявно приводимыми друг к другу.

THEN result_expression
Выражение, возвращаемое, когда равенство input_expression и when_expression имеет значение TRUE или Boolean_expression имеет значение TRUE. result expression — это любое допустимое выражение.

ELSE else_result_expression
Это выражение, возвращаемое, если ни одна из операций сравнения не дает в результате TRUE. Если этот аргумент опущен и ни одна из операций сравнения не дает в результате TRUE, функция CASE возвращает NULL. else_result_expression — это любое допустимое выражение. Типы данных аргумента else_result_expression и каждого из выражений result_expression должны быть одинаковыми или неявно приводимыми друг к другу.

WHEN Boolean_expression
Логическое выражение, полученное при использовании поискового формата функции CASE. Boolean_expression — это любое допустимое логическое выражение.

Типы возвращаемых данных

Возвращает тип с наивысшим приоритетом из набора типов в выражении result_expressions и необязательном выражении else_result_expression. Дополнительные сведения см. в разделе Приоритет типов данных (Transact-SQL).

Возвращаемые значения

Простое выражение CASE

Простое выражение CASE сравнивает первое выражение с выражением в каждом предложении WHEN. Если эти выражения эквивалентны, то возвращается выражение в предложении THEN.

  • Допускается только проверка равенства.

  • В указанном порядке сравнивает значения выражений input_expression и when_expression для каждого предложения WHEN.

  • Возвращает выражение result_expression, соответствующее первой операции input_expression = when_expression, равной TRUE.

  • Если ни одна из операций input_expression = when_expression не дает значения TRUE, Компонент SQL Server Database Engine возвращает выражение else_result_expression, если указано предложение ELSE, или значение NULL, если предложение ELSE не указано.

Поисковое выражение CASE

  • Вычисляет в указанном порядке выражения Boolean_expression для каждого предложения WHEN.

  • Возвращает выражение result_expression, соответствующее первому выражению Boolean_expression, которое имеет значение TRUE.

  • Если ни одно выражение Boolean_expression не равно TRUE, Компонент Database Engine возвращает выражение else_result_expression, если указано предложение ELSE, или значение NULL, если предложение ELSE не указано.

SQL Server допускает применение в выражениях CASE не более 10 уровней вложенности.

Выражение CASE нельзя использовать для управления потоком выполнения инструкций Transact-SQL, блоков инструкций, определяемых пользователем функций и хранимых процедур. Список методов управления потоком см. в статье Язык управления потоком (Transact-SQL).

Выражение CASE последовательно оценивает свои условия и останавливается, когда находит первое выполнимое условие. В некоторых ситуациях выражение оценивается до того, как выражение CASE получает результаты выражения в качестве входных данных. При оценке этих выражений возможны ошибки. Агрегатные выражения в аргументах WHEN выражения CASE вначале оцениваются, после чего передаются выражению CASE. Например в следующем запросе создается ошибка деления на ноль при вычислении значения агрегата MAX. Это происходит до оценки выражения CASE.

WITH Data (value) AS   
(   
SELECT 0   
UNION ALL   
SELECT 1   
)   
SELECT   
   CASE   
      WHEN MIN(value) = 100 THEN 1   
   END   
FROM Data ;  

Следует создавать зависимости только от порядка оценки условий WHEN для скалярных выражений (в том числе нескоррелированных вложенных запросов, возвращающих скалярные значения), а не для агрегатных выражений.

Примеры

A. Использование инструкции SELECT с простым выражением CASE

При использовании в инструкции SELECT простое выражение CASE позволяет выполнить только проверку на равенство. Другие проверки не выполняются. В следующем примере выражение CASE используется для изменения способа отображения категорий линейки продуктов с целью сделать их более понятными.

USE AdventureWorks2012;  
GO  
SELECT   ProductNumber, Category =  
      CASE ProductLine  
         WHEN 'R' THEN 'Road'  
         WHEN 'M' THEN 'Mountain'  
         WHEN 'T' THEN 'Touring'  
         WHEN 'S' THEN 'Other sale items'  
         ELSE 'Not for sale'  
      END,  
   Name  
FROM Production.Product  
ORDER BY ProductNumber;  
GO  

Б. Использование инструкции SELECT с поисковым выражением CASE

При использовании в инструкции SELECT поисковое выражение CASE позволяет заменять значения в результирующем наборе в зависимости от результатов сравнения. В следующем примере отображается список цен в виде текстового комментария, основанного на диапазоне цен для продукта.

USE AdventureWorks2012;  
GO  
SELECT   ProductNumber, Name, "Price Range" =   
      CASE   
         WHEN ListPrice =  0 THEN 'Mfg item - not for resale'  
         WHEN ListPrice = 50 and ListPrice = 250 and ListPrice 

В. Использование выражения CASE в предложении ORDER BY

В следующем примере выражение CASE используется в предложении ORDER BY, чтобы определить порядок сортировки строк на основе значения заданного столбца таблицы. В первом примере вычисляется значение столбца SalariedFlag таблицы HumanResources.Employee. Сотрудники, для которых столбец SalariedFlag имеет значение 1, возвращаются в порядке BusinessEntityID (по убыванию). Сотрудники, для которых столбец SalariedFlag имеет значение 0, возвращаются в порядке BusinessEntityID (по возрастанию). Во втором примере результирующий набор упорядочивается по столбцу TerritoryName, если столбец CountryRegionName содержит значение «США», и по столбцу CountryRegionName в остальных строках.

SELECT BusinessEntityID, SalariedFlag  
FROM HumanResources.Employee  
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC  
        ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;  
GO    
SELECT BusinessEntityID, LastName, TerritoryName, CountryRegionName  
FROM Sales.vSalesPerson  
WHERE TerritoryName IS NOT NULL  
ORDER BY CASE CountryRegionName WHEN 'United States' THEN TerritoryName  
         ELSE CountryRegionName END;  

Г. Использование выражения CASE в инструкции UPDATE

В следующем примере выражение CASE используется в инструкции UPDATE, чтобы определить значение, установленное в столбце VacationHours для сотрудников, у которых столбец SalariedFlag имеет значение 0. Если при вычитании 10 часов из VacationHours получается отрицательное значение, VacationHours увеличивается на 40 часов. В противном случае значение VacationHours увеличивается на 20 часов. С помощью предложения OUTPUT отображаются исходная и обновленная продолжительности отпуска.

USE AdventureWorks2012;  
GO  
UPDATE HumanResources.Employee  
SET VacationHours =   
    ( CASE  
         WHEN ((VacationHours - 10.00) 

Д. Использование выражения CASE в инструкции SET

В следующем примере выражение CASE используется в инструкции SET для функции dbo.GetContactInfo с табличным значением. В базе данных AdventureWorks2012 все данные, связанные с людьми, хранятся в таблице Person.Person. Например, человек может быть сотрудником, представителем поставщика или заказчиком. Функция возвращает имя и фамилию человека с заданным BusinessEntityID и соответствующий тип контакта для этого пользователя. Выражение CASE в инструкции SET определяет отображаемое значение для столбца ContactType в зависимости от наличия столбца BusinessEntityID в таблицах Employee, Vendor или Customer.

USE AdventureWorks2012;  
GO  
CREATE FUNCTION dbo.GetContactInformation(@BusinessEntityID INT)  
    RETURNS @retContactInformation TABLE   
(  
BusinessEntityID INT NOT NULL,  
FirstName NVARCHAR(50) NULL,  
LastName NVARCHAR(50) NULL,  
ContactType NVARCHAR(50) NULL,  
    PRIMARY KEY CLUSTERED (BusinessEntityID ASC)  
)   
AS   
-- Returns the first name, last name and contact type for the specified contact.  
BEGIN  
    DECLARE   
        @FirstName NVARCHAR(50),   
        @LastName NVARCHAR(50),   
        @ContactType NVARCHAR(50);  
  
    -- Get common contact information  
    SELECT   
        @BusinessEntityID = BusinessEntityID,   
@FirstName = FirstName,   
        @LastName = LastName  
    FROM Person.Person   
    WHERE BusinessEntityID = @BusinessEntityID;  
  
    SET @ContactType =   
        CASE   
            -- Check for employee  
            WHEN EXISTS(SELECT * FROM HumanResources.Employee AS e   
                WHERE e.BusinessEntityID = @BusinessEntityID)   
                THEN 'Employee'  
  
            -- Check for vendor  
            WHEN EXISTS(SELECT * FROM Person.BusinessEntityContact AS bec  
                WHERE bec.BusinessEntityID = @BusinessEntityID)   
                THEN 'Vendor'  
  
            -- Check for store  
            WHEN EXISTS(SELECT * FROM Purchasing.Vendor AS v            
                WHERE v.BusinessEntityID = @BusinessEntityID)   
                THEN 'Store Contact'  
  
            -- Check for individual consumer  
            WHEN EXISTS(SELECT * FROM Sales.Customer AS c   
                WHERE c.PersonID = @BusinessEntityID)   
                THEN 'Consumer'  
        END;  
  
    -- Return the information to the caller  
    IF @BusinessEntityID IS NOT NULL   
    BEGIN  
        INSERT @retContactInformation  
        SELECT @BusinessEntityID, @FirstName, @LastName, @ContactType;  
    END;  
  
    RETURN;  
END;  
GO  
  
SELECT BusinessEntityID, FirstName, LastName, ContactType  
FROM dbo.GetContactInformation(2200);  
GO  
SELECT BusinessEntityID, FirstName, LastName, ContactType  
FROM dbo.GetContactInformation(5);  

Е. Использование выражения CASE в предложении HAVING

В следующем примере выражение CASE используется в предложении HAVING, чтобы ограничить строки, возвращаемые инструкцией SELECT. Инструкция возвращает максимальную почасовую ставку для каждой должности в таблице HumanResources.Employee. Предложение HAVING ограничивает должности, оставляя только те, которые заняты мужчинами с максимальной почасовой ставкой более 40 долларов или женщинами с максимальной почасовой ставкой более 42 долларов.

USE AdventureWorks2012;  
GO  
SELECT JobTitle, MAX(ph1.Rate)AS MaximumRate  
FROM HumanResources.Employee AS e  
JOIN HumanResources.EmployeePayHistory AS ph1 ON e.BusinessEntityID = ph1.BusinessEntityID  
GROUP BY JobTitle  
HAVING (MAX(CASE WHEN Gender = 'M'   
        THEN ph1.Rate   
        ELSE NULL END) > 40.00  
     OR MAX(CASE WHEN Gender  = 'F'   
        THEN ph1.Rate    
        ELSE NULL END) > 42.00)  
ORDER BY MaximumRate DESC;  

Примеры: Azure Synapse Analytics и Параллельное хранилище данных

Ж. Использование инструкции SELECT с выражением CASE

При использовании в инструкции SELECT выражение CASE позволяет заменять значения в результирующем наборе в зависимости от результатов сравнения. В приведенном ниже примере выражение CASE используется для изменения способа отображения категорий линейки продуктов с целью сделать их более понятными. Если значение отсутствует, выводится текст "Not for sale".

-- Uses AdventureWorks  
  
SELECT   ProductAlternateKey, Category =  
      CASE ProductLine  
         WHEN 'R' THEN 'Road'  
         WHEN 'M' THEN 'Mountain'  
         WHEN 'T' THEN 'Touring'  
         WHEN 'S' THEN 'Other sale items'  
         ELSE 'Not for sale'  
      END,  
   EnglishProductName  
FROM dbo.DimProduct  
ORDER BY ProductKey;  

З. Использование выражения CASE в инструкции UPDATE

В следующем примере выражение CASE используется в инструкции UPDATE, чтобы определить значение, установленное в столбце VacationHours для сотрудников, у которых столбец SalariedFlag имеет значение 0. Если при вычитании 10 часов из VacationHours получается отрицательное значение, VacationHours увеличивается на 40 часов. В противном случае значение VacationHours увеличивается на 20 часов.

-- Uses AdventureWorks   
  
UPDATE dbo.DimEmployee  
SET VacationHours =   
    ( CASE  
         WHEN ((VacationHours - 10.00) 

Оператор switch

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

Представим себе переменную $action, которая может иметь значения "JUMP" (прыгать), "SWEEM" (плавать), "FLY" (летать). Оператор switch позволяет легко определить блок кода, который должен исполняться для каждого из этих значений. Чтобы показать разницу между операторами if и switch, выполним проверку переменной на соответствие нескольким значениям. Следующий пример показывает два различных способа сделать то же самое. Первый способ использует серию операторов if и elseif, а второй - оператор switch:

Оператор 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 чаще всего опускают.

Оператор if/else и elseif

Наиболее часто в коде вы будете сталкиваться именно с этим оператором. В общем виде он записывается вот так:


if($a > $b) {
  //Действие 1 если условие истинно и $a действительно больше $b
} else {
 //Действие 2 если условие ложно
}

Есть дополнительный оператор elseif() который позволяет проверить ещё одно или несколько условий прямо в этом ветвлении.


if($a > $b) {
  //Действие 1 если условие истинно и $a действительно больше $b
} elseif($a 

Следует отметить что php язык с динамической типизацией и если в if() передать какое-то число php будет пытаться преобразовать его в тип bool и на основе полученного результата принять решение о дальнейшем выполнении кода. Например положительное целое 1 (тип int) с лёгкостью приводится в true типа bool. Это и удобно и не удобно одновременно. Динамическая типизация позволяет разрабатывать приложение быстро, однако  очень легко словить логическую ошибку. Т.е. программа будет работать «верно» но делать не то, что от неё ожидается. Случается это как раз потому, что порой  автоматическое приведение типа выражения в if() к логическому значению ведёт выполнение программы не в то русло.

И так, блоков ifelse() { ... } как вы понимаете можно добавить много. Однако для такого случая в php предусмотрен специальный оператор switch case о котором пойдёт речь ниже.

Оператор switch/case

Допустим у нас на входе есть некая переменная $type которая содержит строковое обозначение типа поля в веб-форме, которую вам необходимо вывести на экран. Значения могут быть такими:

  1. S — строка, обычное текстовое поле
  2. N — число
  3. E — email адрес
  4. C — чекбокс
  5. R — радиобокс
  6. T — текстовая область textarea
  7. B — кнопка
  8. L — выпадающий список

Если использовать коyструкцию if() { ... } elseif() { ... } esle { ... } получаем довольно громоздкий код:


if($type == 'S') {
  //Выводим текстовое поле
} elseif($type == 'N') {
  //Выводим числовое поле
} elseif($type == 'E') {
  //Выводим поле ввода email-адреса
} elseif($type == 'C') {
  //Выводим checkbox
} elseif($type == 'R') {
  //Выводим radiobox
} elseif($type == 'T') {
  //Выводим textarea
} elseif($type == 'B') {
  //Выводим кнопку
} elseif($type == 'L') {
  //Выводим выпадающий список
} else {
  //Выводим скрытое поле hidden
}

Как я у же говорил выше, для таких множественных ветвлений используется конструкция switch (проверяемое значение) { case значение: действие brack; }.


switch ($type){
    case 'S':
        //Выводим текстовое поле
    break;
    
    case 'N':
        //Выводим числовое поле
    break;
    
    case 'E':
        //Выводим поле ввода email-адреса
    break;
    
    case 'C':
        //Выводим checkbox
    break;
    
    case 'R':
        //Выводим radiobox
    break;
    
    case 'T':
        //Выводим textarea
    break;
    
    case 'B':
        //Выводим кнопку
    break;
    
    case 'L':
        //Выводим выпадающий список
    break;
    
    default:
        //Выводим скрытое поле hidden
}

Условие так же довольно громоздко, но воспринимается в коде проще.

Тернарный оператор сравнения

Иногда вам необходимо встроить небольшую проверку значения например в цикл формирования массива php. Вставлять туда полноценный if() {…} else {…} неудобно, т.к. код получится слишком громоздким. Для решения этой проблемы в php предусмотрен тернарный оператор сравнения. Его синтаксис можно описать следующим образом:


(условие) ? действие когда условие истино : действие когда условие ложно;

Под действием в данном случае подразумевается возврат или вывод какого-то значения. Например, формируем некоторый массив и округляем значение если оно является числом:


//некоторый массив входных значений
$arr = [12154.14215, 2.225, 'test', 3.14, 'bbb', 'aa', 5, 11];
$arrRes = [];

foreach ($arr as $item) {
    $arrRes[] = (is_numeric($item)) ? round($item, 2) : $item;
}

echo '
'; var_dump($arrRes); echo '
';

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


array(8) {
  [0]=>
  float(12154.14)
  [1]=>
  float(2.23)
  [2]=>
  string(4) "test"
  [3]=>
  float(3.14)
  [4]=>
  string(3) "bbb"
  [5]=>
  string(2) "aa"
  [6]=>
  float(5)
  [7]=>
  float(11)
}