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

Условия в PHP

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

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

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

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

<?php

if (условие) {
    код, который нужно выполнить, если условие выполнено;
}

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

<?php

if (true) {
    echo 'Условие выполнено';
}

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

<?php

$x = 15;

if ($x > 10) {
    echo 'Число больше 10';
}

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

Число больше 10

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

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

<?php

$x = 15;

if ($x > 10) {
    echo 'Число больше 10';
} else {
    echo 'Число меньше либо равно 10';
}

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

Число больше 10

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

Число меньше либо равно 10

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

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

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

<?php

$x = 10;

if ($x > 10) {
    echo 'Число больше 10';
} elseif ($x == 10) {
    echo 'Число равно 10';
}

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

Число равно 10

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

<?php

$x = 9;

if ($x > 10) {
    echo 'Число больше 10';
} elseif ($x == 10) {
    echo 'Число равно 10';
} else {
    echo 'Число меньше 10';
}

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

<?php

$x = 3;

if ($x <= 0) {
    echo 'Число меньше либо равно 0';
} elseif ($x == 1) {
    echo 'Число равно 1';
} elseif ($x == 2) {
    echo 'Число равно 2';
} else {
    echo 'Число не подошло ни под одно из условий';
}

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

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

<?php

$x = (boolean)3;

var_dump($x);

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

<?php

if (3) {
    echo 'Условие выполнено';
}

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

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

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

'0'

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

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

Оператор switch

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

<?php

$x = 1;

switch ($x) {
    case 1:
        echo 'Число равно 1';
        break;
    case 2:
        echo 'Число равно 2';
        break;
    default:
        echo 'Число не равно ни 1, ни 2';
}

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

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

Число равно 1

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

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

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

<?php

$x = 1;

if ($x == 1) {
    echo 'Число равно 1';
} elseif ($x == 2) {
    echo 'Число равно 2';
} else {
    echo 'Число не равно ни 1, ни 2';
}

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

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

И снова про switch

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

<?php

$x = 2;

switch ($x) {
    case 1:
    case 2:
        echo 'Число равно 1 или 2';
        break;
    case 5:
        echo 'Число равно 5';
        break;
    default:
        echo 'Число не равно ни 1, ни 2, ни 5';
}

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

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

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

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

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

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

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

<?php

$x = 2;

if ($x % 2 == 0) {
    echo 'Число чётное';
} else {
    echo 'Число нечётное';
}

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

Модуль

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

<?php

$x = -2;

if ($x >= 0) {
    echo 'Модуль числа: ' . $x;
} else {
    echo 'Модуль числа: ' . -$x;
}

Результат:

Модуль числа: 2

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

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

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

условие ? результат_если_true : результат_если_false

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

<?php

$x = -2;

$mod = $x >= 0 ? $x : -$x;

echo 'Модуль: ' . $mod;

Результат:

Модуль: 2

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

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

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

<?php

$x = 105;

if ($x > 0) {
    if ($x >= 100) {
        echo 'Число больше либо равно 100';
    } else {
        echo 'Число больше 0 но меньше 100';
    }
} else {
    echo 'Число меньше либо равно 0';
}

Итог

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

Присоединяйтесь к нам в ВКонтакте и в Facebook, чтобы не пропустить новые уроки. А также вступайте в наш чат PHP-разработчиков в Telegram.
Домашнее задание

Попробуйте следующие условия:

  • if (‘string’) {echo ‘Условие выполнилось’;}
  • if (0) {echo ‘Условие выполнилось’;}
  • if (null) {echo ‘Условие выполнилось’;}
  • if (5) {echo ‘Условие выполнилось’;}

Объясните результат.
С помощью тернарного оператора определите, является ли число чётным или нечётным и выведите результат.

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


Serega

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

ivashkevich

Как вариант:

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

Элегантно.

Igorencio

echo ($x % 2 == 0) ? 'четное' : 'нечетное';
нужны ли тут скобки?

kizil.vitali@gmail.com

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

ivashkevich

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

Ogurchik

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

ivashkevich

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

Ogurchik

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

ivashkevich

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

phenomg

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

3)

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

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

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

Igorencio

А вот тут я не согласен, вместо знака определения остатка стоит знак деления. Он не будет определять четность или нечетность. Вроде бы я прав)))

ivashkevich

Действительно, глаз уже замылился проверять. Спасибо.

ivashkevich

Тут у Вас ошибку нашли - так не работает.

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
$x = 7 ;
echo  '<br>', 'число  ', $x ;
$x=$x % 2 == 0 ? '  чётное' : '  нечётное' ;
echo   $x ;

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

ivashkevich

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

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

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

WarLikeLaux

enter image description here

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

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

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

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

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

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

echo '<br><br>';

А вот это:

case $x % 2 == 1:

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

default:

Так как:

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

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

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

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

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

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

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

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

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

ivashkevich

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

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

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

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

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

Fox-24

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

Gleb

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

ivashkevich

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

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

if ('string') {
    echo 'Условие выполнилось'; // строка получается true
}
echo '<br>';

if (0) {
    echo 'Условие выполнилось'; // ноль получается как false
}
echo '<br>';

if (null) {
    echo 'Условие выполнилось'; // null пустая строка тоже как false
}
echo '<br>';

if (5) {
    echo 'Условие выполнилось'; // положительное число интерпритируется как true
}

echo '<br>';
$x = 6;

$result = $x % 2 == 0 ? 'Четное число' : 'Нечетное число'; // проверяем равен ли остаток от деления 0 и если да то выводим true, если нет то false

echo $result;
ivashkevich

null - это не пустая строка. Пустая строка это - ''. А null - это отсутствие значения. При преобразовании к bool приводится в false.

В остальном все правильно.

309st@mail.ru

не правильно выразил свои мысли))) имел ввиду "нулевое" (отсутствующее) значение))

ivashkevich

Даже нулевым его называть не стоит. Ноль - это 0. Это все же присутствие значения числа 0. А null - это вообще отсутствие какого-либо значения. Называйте его null, и никак иначе.

309st@mail.ru

хорошо! Спасибо за разъяснение =)

Yuriy

читал про то, что использование if ($a === $b) быстрее выполняется, чем if ($a == $b) и switch case. Насколько это верно и имеет смысл такого подхода в программировании?

ivashkevich

== работает медленнее, потому что приводит перед сравнением аргументы к одному типу. А вот === сразу сравнивает, без приведения типов.

3 == '3' // true

но

3 === '3' // false

Реальной разницы в скорости вы не заметите в 99% случаев, но дело в том, что за счет более строгого сравнения при использовании === достигается бОльшая надёжность кода.

Kutkh
$x =  3;

$x % 2 ? $result = 'Число нечетное' : $result = 'Число четное';

echo $result;
ivashkevich

Неправильное использование тернарного оператора - он возвращает результат. Правильно вот так:

$result = $x % 2 === 1 ? 'Число нечетное' : 'Число четное';

То есть присваивать нужно результат его работы, а не внутри него.

Kutkh

понял, спасибо!

Mike
$x= 3;
$x%2==0 ? $x='chet' : $x='nechet';
echo $x;
ivashkevich

Неправильно используете тернарный оператор - смотрите комментарий выше.

virtual2018
<?php
$number = 1;
echo $result = $number % 2 ? 'нечетное число' : 'четное число';
echo '<br>';

if (‘string’)
    echo 'Условие выполнилось'.'<br>'; //string this is TRUE 
if (0)
    echo 'Условие выполнилось'.'<br>';
else
    echo 'Условие не выполнилось'.'<br>'; // 0 this is FALSE
if (null)
    echo 'Условие выполнилось'.'<br>';
else
    echo 'Условие не выполнилось'.'<br>'; //NULL this is FALSE
if (5)
    echo 'Условие выполнилось'.'<br>'; //5 this is TRUE

нечетное число
Условие выполнилось
Условие не выполнилось
Условие не выполнилось
Условие выполнилось

Популярное за сутки
Сейчас читают
Логические задачи с собеседований