Добрались до логики выполнения программы. И так условные операторы (по другому операторы ветвления) позволяют нам организовать определённое поведение программы в зависимости от входных параметров (данных вводимых пользователем, результатом работы вспомогательных функций). Вся логика в языках программирования основана на Алгебре Буля. Согласно определению Алгебра Буля (или алгебра логики) — это раздел математики, изучающий высказывания (или выражения в случае программирования), рассматриваемые со стороны их логических значений (истинности или ложности) и логических операций над ними.
Вот такое сравнение, может служить простым примером алгебры логики.
1 > 2 => false
Один больше двух? Нет. Т.е. утверждение что «Один больше двух» является ложным. Ещё немного «псевдокода».
Если (a > b) {
//тогда делаем действие 1
} Иначе {
//Делаем действие 2
}
Результат сравнения двух переменных (a и b) в данном примере будет истинным или ложным, в зависимости от этого программа выполнит первое или второе действие. Например.
КоличествоДнейВГоду = 366; //Значение в данном случае может браться из вне
Если (КоличествоДнейВГоду > 365 ){
"Это високосный год!"
} иначе {
"Это обычный год."
}
В этом примере мы проверяем не превышает ли количество дней в году число 365 и сообщаем что год високосный если условие истинно иначе говорим, что год обычный. По сути подобным образом операторы сравнения работаю в программировании. К слову в языках программирования есть специальный тип данных bool
т.е. логический. Переменные этого типа могут иметь одно из двух значений true
— истина и false
— ложь. Давайте теперь разберём как работают условные операторы в языке php.
Оператор if/else и elseif
Наиболее часто в коде вы будете сталкиваться именно с этим оператором. В общем виде он записывается вот так:
if($a > $b) {
//Действие 1 если условие истинно и $a действительно больше $b
} else {
//Действие 2 если условие ложно
}
Есть дополнительный оператор elseif() который позволяет проверить ещё одно или несколько условий прямо в этом ветвлении.
if($a > $b) {
//Действие 1 если условие истинно и $a действительно больше $b
} elseif($a < $b) {
//Действие 2 если условие 1 ложно а условие 2 истинно и $a меньше $b
} else {
//Действие 3, когда оба предыдущих условия ложны
}
Следует отметить что php язык с динамической типизацией и если в if()
передать какое-то число php будет пытаться преобразовать его в тип bool
и на основе полученного результата принять решение о дальнейшем выполнении кода. Например положительное целое 1
(тип int
) с лёгкостью приводится в true
типа bool
. Это и удобно и не удобно одновременно. Динамическая типизация позволяет разрабатывать приложение быстро, однако очень легко словить логическую ошибку. Т.е. программа будет работать «верно» но делать не то, что от неё ожидается. Случается это как раз потому, что порой автоматическое приведение типа выражения в if()
к логическому значению ведёт выполнение программы не в то русло.
И так, блоков ifelse() { ... }
как вы понимаете можно добавить много. Однако для такого случая в php предусмотрен специальный оператор switch case о котором пойдёт речь ниже.
Оператор switch/case
Допустим у нас на входе есть некая переменная $type которая содержит строковое обозначение типа поля в веб-форме, которую вам необходимо вывести на экран. Значения могут быть такими:
- S — строка, обычное текстовое поле
- N — число
- E — email адрес
- C — чекбокс
- R — радиобокс
- T — текстовая область textarea
- B — кнопка
- 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 '<pre>'; var_dump($arrRes); echo '</pre>';
В примере мы перебираем массив элементы массива, проверяем являются ли они числом при помощи функции 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)
}
Вложенные условия
Помимо использования конструкции if() {...} elseif() {...} else {...}
мы можем использовать вложенное условие. Рассмотрим пример. Дана координатная сетка, координаты на сетке могут принимать значения от -5 до +5. Соответственно получая координаты точки x,y нам необходимо проверить и сообщить пользователю в какой части сетки А,Б,В или Г находится эта точка.
Для этой задачи отлично подойдут вложенные условия. Давайте смотреть код:
$x = 1;
$y = 2;
//Основное условие
if($x > 0){
//Вложенное услвоие 1
if($y > 0) {
echo 'Точка находится в секторе Б';
} else {
echo 'Точка находится в секторе Г';
}
} else {
//Вложенное услвоие 2
if($y > 0) {
echo 'Точка находится в секторе А';
} else {
echo 'Точка находится в секторе В';
}
}
В данном примере будет выведено «Точка находится в секторе Б». Обратите внимание, первым условием $x > 0
мы отсекаем часть возможных вариантов расположения точки. Проверяя значение $x мы выясняем с какой стороны от линии абсциссы находится наша точка. Затем вложенным условием проверяем $y и так же определяем с какой стороны относительно ординаты будет наша точка.
Вложенная проверка часто экономит нам ресурсы сразу отсекая множество не верных вариантов решения. Их так же можно многократно вкладывать друг в друга или использовать вперемешку со switch(), но не увлекайтесь, вам следует выдерживать баланс между читабельностью кода и вложенностью условных операторов. Стремитесь к простоте как в python.
Ещё совет. Сложные проверки лучше выносить в отдельные функции, как бы скрывая логику «под капотом», такая функция может возвращать булевское значения, и вместо сложной длинной проверки в основном коде, вам достаточно будет вызвать одну функцию и передать ей проверяемые значения, а дальше использовать результат работы функции (true/false) для дальнейшего ветвления в программе.
Надеюсь материал был вам полезен. Желаю удачи!