Чат веб-разработчиков
Условия в PHP: операторы if, else, switch, тернарный оператор

Условия в PHP

Всем привет! Вот и очередной урок по PHP подоспел. Сегодняшняя тема – одна из самых любимых у тех, кто начинает программировать. Ещё бы, ведь условия в PHP – это то, что позволяет нам составлять различные алгоритмы. Именно в зависимости от условий программа будет вести себя так или иначе. И именно благодаря им мы можем получать разный результат при разных входных данных. В PHP имеются несколько конструкций, с помощью которых можно реализовать условия. Все они используются, и имеют свои преимущества в разных ситуациях, или, если хотите – условиях. Кругом одни условия, не так ли? Так. Никто ведь не будет спорить, что в реальной жизни в зависимости от обстоятельств мы поступаем по-разному. В программировании это не менее важно и сейчас мы этому научимся.

Как вы должны помнить из прошлого урока, в PHP, в зависимости от оператора, операнды приводятся к определённому типу. Для операторов условий в PHP действуют те же правила, и здесь операнд всегда приводится к булевому значению. В случае, если это значение true, то считаем, что условие выполнено, а в случае, если false – то условие не выполнено. В зависимости от того, выполнено ли условие, мы можем делать или не делать какие-либо действия. И тут я предлагаю рассмотреть первый условный оператор – if.

Условный оператор if

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

Код доступен только после покупки курса PHP для начинающих.

А в реальной жизни использование оператора if выглядит следующим образом:

Код доступен только после покупки курса PHP для начинающих.

Здесь мы явно передали оператору значение true. Разумеется, это абсолютно бессмысленно. Давайте с помощью условия будем определять числа больше 10. Это довольно просто:

Код доступен только после покупки курса PHP для начинающих.

И после запуска мы увидим результат:

Код доступен только после покупки курса PHP для начинающих.

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

А можно ли сделать так, чтобы, когда условие не выполнилось, выполнился другой код? Конечно можно! Для этого вместе с оператором if используют оператор else (по-русски - иначе). Он пишется после фигурных скобок, в которые заключается код, выполняющийся при выполненном условии. И выглядит конструкция следующим образом:

Код доступен только после покупки курса PHP для начинающих.

Здесь опять же на экран будет выведено сообщение:

Код доступен только после покупки курса PHP для начинающих.

Однако если мы изменим входные данные, и переменной $x в самом начале присвоим значение 8, то выведется сообщение:

Код доступен только после покупки курса PHP для начинающих.

Попробуйте сделать это прямо сейчас.

Конструкция if-elseif-else: несколько условий

В случае, если вам нужно проверить несколько условий, после оператора if добавляется ещё и оператор elseif. Он проверит условие, только если не выполнится первое условие. Например:

Код доступен только после покупки курса PHP для начинающих.

В данном случае, на экран будет выведено:

Код доступен только после покупки курса PHP для начинающих.

И да, после этого оператора можно добавить else. Код внутри него будет выполнен, если не выполнилось ни одно из условий:

Код доступен только после покупки курса PHP для начинающих.

Результат этого кода, я полагаю, объяснять не нужно. Да, кстати, возможен целый список из elseif-ов. Например, такой:

Код доступен только после покупки курса PHP для начинающих.

Приведение к boolean

Помните, в уроке про типы данных в PHP мы с вами научились явно приводить значения к какому-либо типу. Например:

Код доступен только после покупки курса PHP для начинающих.

Результатом будет true.
Работающее так же, только неявное преобразование, всегда происходит в условии. Например, следующее условие:

Код доступен только после покупки курса PHP для начинающих.

Выполнится успешно, так как число 3 будет преобразовано к true. К false будут приводиться следующие значения:

  • '' (пустая строка)
  • 0 (число 0)

Таким образом, любое ненулевое число и ненулевая строка будут преобразованы в true и условие выполнится. Исключение – строка, состоящая из одного нуля:

Код доступен только после покупки курса PHP для начинающих.

Она также будет преобразована к false.

Я затронул эту тему с приведением к boolean в домашнем задании к этому уроку. Обязательно его выполните. А сейчас давайте перейдём к следующему условному оператору.

Оператор switch

Помимо конструкции if-else есть ещё один оператор условия. Это – switch. Это очень интересный оператор, требующий запоминания нескольких правил. Давайте для начала посмотрим, как он выглядит на следующем примере:

Код доступен только после покупки курса PHP для начинающих.

Сначала может показаться, что этот оператор довольно сложный. Однако, если разобраться, то всё становится понятно. В операнде switch указывается некоторое выражение. В нашем случае, это переменная $x, а точнее её значение - 1.

В фигурных скобках мы перечисляем операторы case, после которых указываем значение, с которым сравнивается значение операнда switch. Сравнение происходит нестрогое, то есть как будто используем оператор ==. И если условие выполнилось, то выполняется код, указанный после двоеточия. Если же ни одно из условий не выполнилось, то выполняется код из секции default, которой в общем-то может и не быть, и тогда ничего выполняться не будет. Обратите внимание, внутри каждой секции case, в конце мы прописали оператор break. Это делается для того, чтобы после выполнения кода в случае выполнения условия не продолжилась проверка условий. То есть, если бы не было break в конце секции case 1, то после того, как вывелся бы текст

Код доступен только после покупки курса PHP для начинающих.

продолжило бы выполняться условие сравнения с 2, а затем бы выполнился и код в секции default. Не забывайте писать break!

Сравнение switch с if

Вообще, этот код можно было бы записать и с помощью конструкции if-elseif-else:

Код доступен только после покупки курса PHP для начинающих.

Но в виде конструкции switch-case код в конкретно этом случае выглядит проще. И вот почему:

  1. мы сразу видим, что конкретно мы сравниваем (переменную $x) и понимаем, что сравниваем в каждом условии именно это значение, а не какое-либо ещё;
  2. глазу удобнее воспринимать то, с чем сравниваем – секции case 1, case 2 визуально воспринимаются легче, сравниваемое значение заметнее.

И снова про switch

И я ещё не всё сказал про switch - можно писать несколько case-ов подряд, тогда код выполнится при условии, что выполнен хотя бы один из них. Например:

Код доступен только после покупки курса PHP для начинающих.

Согласитесь, это может быть удобно.

Хорошо, давайте пройдёмся по особенностям оператора switch, о которых нужно помнить всегда.

  1. break прерывает набор условий, не забывайте указывать его;
  2. секция default будет выполнена, если не выполнилось ни одно из условий. Она может и вовсе отсутствовать;
  3. несколько case-ов могуть быть записаны подряд, тогда код в секции выыполнится при выполнении хотя бы одного из условий.

Немного практики

Ну что, запомнили операторы условий? Давайте закрепим на практике более реальными примерами.

Чётное или нечётное

Вот один из примеров – нужно определить, чётное ли число или нет. Для этого нам нужно проверить, что остаток от деления на 2 будет равен 0. Подробнее об операторах читайте тут. Давайте сделаем это:

Код доступен только после покупки курса PHP для начинающих.

Попробуйте самостоятельно изменить значение переменной $x. Круто, да? Оно работает!

Модуль

Давайте теперь научимся вычислять модуль числа. Если число больше или равно нулю, то нужно вывести само это число, если меньше – заменить знак с минуса на плюс.

Код доступен только после покупки курса PHP для начинающих.

Результат:

Код доступен только после покупки курса PHP для начинающих.

Как мы видим, всё успешно отработало.

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

Помимо этого, в PHP есть ещё один оператор, который представляет собой сокращённую форму конструкции if-else. Это тернарный оператор. При этом он возвращает разные результаты, в зависимости от того, выполнено ли условие или нет. В общем виде его использование выглядит следующим образом:

Код доступен только после покупки курса PHP для начинающих.

Или на примере того же нахождения модуля:

Код доступен только после покупки курса PHP для начинающих.

Результат:

Код доступен только после покупки курса PHP для начинающих.

Круто, да? Тернарный оператор – очень элегантно вписывается при решении таких вот простеньких задачек.

И ещё немного практики

Условия можно помещать внутрь друг друга и вообще, чего с ними только можно не делать. Например:

Код доступен только после покупки курса PHP для начинающих.

Итог

Друзья, надеюсь вам понравился урок. Если это так – буду рад, если вы поделитесь им в социальных сетях или расскажете друзьям. Это лучшая поддержка проекта. Спасибо тем, кто это делает. Если у вас возникли какие-то вопросы или замечания – напишите об этом в комментариях. А сейчас – все быстренько делаем домашнее задание, там ещё больше интересных примеров с условиями. Всем пока!

Читайте также
Комментарии


Serega
Serega

Привет, Такой вопрос по домашке, Через оператор if определяю число четное и нечетное, а вот через тернарный оператор ни как не получается.)

ivashkevich
ivashkevich

Как вариант:

echo $x % 2 == 0 ? 'четное' : 'нечетное';
ol
ol

Элегантно.

kizil.vitali@gmail.com
kizil.vitali@gmail.com

Привет, хочу водить числа не в код, а в браузере и использовать их, как это лучше сделать?

ivashkevich
ivashkevich

Привет, хорошее желание! Скоро будет урок по этой теме, не забегай вперед.

Ogurchik
Ogurchik

Привет! В примере про четное-нечетное, если ввести, например, $x = 2.2 (т.е. присвоить не integer, а float), то результат выводится как "четное", хотя это дробное число. Скажи, пожалуйста, почему так происходит и как сделать проверку условия на целочисленное значение?

ivashkevich
ivashkevich

Привет, можно в самом начале сделать вызов функции is_int(число), которая проверит является ли значение целым числом, и вернёт true или false. Документация по функции тут.

Ogurchik
Ogurchik

Спасибо! Всё получилось)
Еще 1 вопрос. В последнем примере этого урока, если я не ошибаюсь, правильно будет написать условие if ($x >= 100) , а не if ($x > 100). Посмотрите, пожалуйста.

ivashkevich
ivashkevich

Совершенно верно! Спасибо, исправил =)

phenomg
phenomg

2) Выполнятся 1 и 4 выражение, так как "string" и 5 переводятся в значение true, в то время как 0 и null (отсутствие значения) преобразуются в значение false.

3)

$a = 5;
$number = $a / 2 == 0 ? "четным" : "нечетным";

echo "Число $a является $number";
ivashkevich
ivashkevich

Совершенно верно =)

Generalisimus
Generalisimus
<?php
/*
if ('ball in goal'){
    echo "nice shoot";
}
else {
    echo "bol in out";
}
*/
/*
if (0) {
    echo "true";
}
else {
    echo "false";
}
*/
/*
 if (null) {
    echo"true it`s null";
}
else {
    echo"it is wrong number";
}
*/
/*
if (5) {
    echo "password is correct";
}
else {
    echo  "password is incorrect";
} // в данном случае число 5 явлается числом true
*/
/*
$a=5;
if ($a%2) {
    echo "переменная  нечетная";
} else {
    echo "переменная  четная";
}
serb2017
serb2017
$x = 7 ;
echo  '<br>', 'число  ', $x ;
$x=$x % 2 == 0 ? '  чётное' : '  нечётное' ;
echo   $x ;

На экране:
число 7 нечётное

ivashkevich
ivashkevich

Хорошо, но есть пара мелких замечаний:

  1. Не стоит переменной $x, в которой лежит число, присваивать строку. Ваша переменная должна быть для чего-то предназначенной, и нельзя в неё записывать что-то постороннее. Назовите итоговую переменную $result, если уж хочется использовать переменную. А вообще - здесь сразу можно писать:
    echo $x % 2 == 0 ? '  чётное' : '  нечётное' ;
  2. Поправьте отступы. У вас местами по 2 пробела в коде. Такого быть не должно. Прочитайте про Reformat Code в PhpStorm.
serb2017
serb2017

Прочитал и воспользовался Reformat Code в PhpStorm. Полезная штука !

WarLikeLaux
WarLikeLaux

enter image description here

markEvillive
markEvillive
<?php
if ('string') {
    echo 'Условие выполнено';
}else{
    echo 'Условие не выполнено';
}// Условие выполнено, ибо любое ненулевое чисо (строка) приводится к true, и условие выполняется
 echo "<br>";
if (0) {
    echo 'Условие выполнено';
}else{
    echo 'Условие не выполнено';
} // Условие не выполнено, ибо нулевое значение приводится к false
echo "<br>";
if (null) {
    echo 'Условие выполнено';
}else{
    echo 'Условие не выполнено';
} // То же, что и в предыдущем случае
echo "<br>";
if (5) {
    echo 'Условие выполнено';
}else{
    echo 'Условие не выполнено';
} // условие выполнено
echo "<br>";
?>

Проверка четности:

  1. С помощью тернарного оператора:

    <?php
    $x = 7;
    $even = $x % 2 == 0 ? 'Число четное' : 'Число нечетное';
    echo $even;
    ?>
  2. С помощью if-else:

    <?php
    $x = 10;
    if($x % 2 == 0){
    echo 'Число четное';
    }else{
    echo 'Число нечетное';
    }
    ?>
  3. С помощью switch:
    <?php
    $x = 5;
    switch ($x % 2){
    case 0:
        echo 'Число четное';
        break;
    default:
        echo 'Число нечетное';
    }
    ?>
ivashkevich
ivashkevich

Отлично! Плюс за вариант со switch-case! =)

1nSide
1nSide
$x = random_int(-1, 10);

if ($x > 0) {
    echo 'число ' . $x . ' четное число или нет? ';
    echo '<br>' . '<br>';

    switch ($x) {
        case $x % 2 == 0:
            echo 'число ' . $x . ' четное';
            break;
        case $x % 2 == 1:
            echo 'число ' . $x . ' нечетное';
            break;
   }
} else { 
   echo 'число меньше или равно 0';
}
ivashkevich
ivashkevich

Ок, из улучшений можно сделать следующее:

echo '<br>' . '<br>';

можно упростить до

echo '<br><br>';

А вот это:

case $x % 2 == 1:

лучше заменить на

default:

Так как:

  • во-первых, лучше всегда делать секцию default
  • во-вторых, интерпретатору не нужно будет вычислять выражение $x % 2 == 1 и он просто выберет оставшийся вариант.

Хорошо, что предусмотрели вариант с числом меньше нуля - за это респект :)

nemo.dont@gmail.com
nemo.dont@gmail.com
  1. Выполнились только 1 и 4 условия, 2 и 3 условия (а также пустая строка) после приведения к типу Boolean получают значение false и поэтому условия не выполняются.
  2. После выполнения, как всегда, посмотрела уже готовые варианты в комментариях, поняла как можно упростить. И все же высылаю то, что пришло в голову первым
<?php
$x = 70;
$even = 'Четное';
$odd = 'Нечетное';

$y= $x %2 == 0 ? $y=$even : $y=$odd;

echo $y;

?>
ivashkevich
ivashkevich

Не нужно первое, что пришло в голову :)
В программировании важно не только придумать решение и сделать чтобы работало, нужно еще и поработать над его упрощением. Это самое сложное, но делать это нужно.
По поводу вот этой строки:

$y= $x %2 == 0 ? $y=$even : $y=$odd;

Когда вы делаете $y = $even, в $y уже попадает нужное значение. Вам же нужно в $y передать результат тернарного оператора, то есть вот так:

$y= $x % 2 === 0 ? $even : $odd;
nemo.dont@gmail.com
nemo.dont@gmail.com

к сожалению, пока то, что первое пришло в голову приходит долго и мучительно. а когда начинаю что-нибудь "мудрить" все ломается ))

вот даже по поводу исправленной строки сидела и 5 минут думала что, как и почему )

ivashkevich
ivashkevich

Это приходит не сразу, нужно время. Я по возможности буду направлять в нужное русло.

Fox-24
Fox-24
if ('string') {
    echo 'Условие ОК'; // Будет выполняться т.к. идет проверка на true или false. В данном случае строка не пустая и не содержит 0, значит true
}

if (0) {
    echo 'Условие ОК'; // Не будет выполняться т.к. в данном случае строка содержит 0, значит false
}

if (null) {
    echo 'Условие ОК'; // Не будет выполняться null - это отсутствие данныех, а значит false
}

if (5) {
    echo 'Условие ОК'; // Будет выполняться т.к. в данном случае строка содержит 5(не 0 и не пустую строку), значит true
}

$x = 2; // Вводные данные

$result = $x % 2 == 0 ? "Число $x четное" : "Число $x не четное"; // Проверка остатка при делении на 2 и запись результата проверки условия в переменную result

echo $result; // Выводим результат
ivashkevich
ivashkevich
if (0) {
    echo 'Условие ОК'; // Не будет выполняться т.к. в данном случае строка содержит 0, значит false
}

if (5) {
    echo 'Условие ОК'; // Будет выполняться т.к. в данном случае строка содержит 5(не 0 и не пустую строку), значит true
}

Это не строки, это - числа. Ещё можно просто назвать это выражениями, но не строками.

А так - всё хорошо =)

Fox-24
Fox-24

Да, конечно, был не внимателен при описании. Спасибо!:)

Gleb
Gleb

В примере про четное/нечетное, если ввести число состоящее более чем из 15 цифр, например, 9999999999999999 (16 цифр), то результат выводится как "Число чётное". Это баг или фича? ))

ivashkevich
ivashkevich

Это баг) можете прочитать об ограничениях значений типа integer - они не бесконечны.

honor
honor
$a = 3;
$result = $a % 2 == 0 ? 'чётное' : 'нечетное';
echo $result;
Ros
Ros
$x = -6;
if ($x <= 0) {
 echo 'Число меньше или равно нулю';
}
else {
    echo $x % 2 == 0 ? 'Чётное' : 'Нечётное';
}