Сейчас мы с вами научимся работать с флагами. Флаг - это специальная переменная, которое может принимать только два значения: true и false. С помощью флагов можно решать задачи, проверяющие отсутствие чего-либо: к примеру, можно проверить, что в массиве нет элемента с определенным значением. Давайте приступим.
Флаги
Давайте решим следующую задачу: дан массив, нужно проверить, есть ли в нем элемент со значением 'c' или нет. Если есть - выведем 'есть', если нет - выведем 'нет'.
Для начала давайте попробуем вывести 'есть'. Для этого переберем все элементы нашего массива и ифом будем спрашивать - равен ли текущий элемент значению 'c'. Если равен - выведем 'есть':
<?php
$arr = ['a', 'b', 'c', 'd', 'e'];
foreach ($arr as $elem) {
if ($elem == 'c') {
echo 'Есть';
}
}
?>
Но наше решение не очень хорошо: ведь если в массиве будет не одно значение 'c', а несколько, то echo выведется несколько раз. Давайте исправим наш массив (сделаем два элемента с 'c') и убедимся в этом:
<?php
$arr = ['a', 'b', 'c', 'd', 'с'];
foreach ($arr as $elem) {
if ($elem == 'c') {
echo 'Есть'; //выведет несколько раз
}
}
?>
Поправим проблему: оборвем цикл с помощью break, если элемент уже найден:
<?php
$arr = ['a', 'b', 'c', 'd', 'с'];
foreach ($arr as $elem) {
if ($elem == 'c') {
echo 'Есть';
break; //оборвем цикл
}
}
?>
Давайте теперь попробуем сделать так, чтобы, если в массиве вообще нет элементов со значением 'c', выводилось 'нет'. Распространенным заблуждением будет добавить else к нашему ифу - в этом случае 'нет' будет выводиться на все элементы, не являющиеся 'c':
<?php
$arr = ['a', 'b', 'c', 'd', 'с'];
foreach ($arr as $elem) {
if ($elem == 'c') {
echo 'Есть';
} else {
echo 'Нет'; //выведет на 'a', 'b' и 'd'
}
}
?>
Итак, идея добавить else - плохая идея, не рабочая. Для решения задач подобного типа (такие задачи встречаются достаточно часто) используют так называемые флаги.
Флаг - это такая переменная, которая может принимать два значения: true или false. Как работать с флагами - посмотрим на примере нашей задачи.
Итак, давайте сделаем переменную flag с таким значением: если она равна true - то в массиве есть элемент 'c', а если false - то такого элемента нет.
Изначально поставим переменную flag в значение false - то есть будем считать, что элемента 'c' в массиве нет:
<?php
$arr = ['a', 'b', 'c', 'd', 'с'];
$flag = false; //считаем, что элемента 'c' нету в массиве
?>
Затем запустим цикл с ифом так, как мы делали это раньше. Если цикл обнаружит, что в массиве есть элемент 'c' - то поставим переменную flag в значение true (и выйдем из цикла с помощью break).
<?php
foreach ($arr as $elem) {
if ($elem == 'c') {
flag = true; //элемент есть - переопределим переменную $flag
break;
}
}
?>
Далее: ответ на вопрос, если в массиве 'c' или нет, мы можем дать только после цикла. И этот ответ у нас уже есть: после цикла переменная flag могла остаться false или могла сменить свое значение на true, если цикл обнаружил в массиве 'c':
<?php
$arr = ['a', 'b', 'c', 'd', 'с'];
$flag = false; //считаем, что элемента 'c' нету в массиве
foreach ($arr as $elem) {
if ($elem == 'c') {
$flag = true; //элемент есть - переопределим переменную $flag
break;
}
}
//тут переменная $flag равна или true, или false
?>
Теперь после цикла мы можем сделать иф, который посмотрит на переменную $flag и выведет на экран 'есть' или 'нет':
<?php
$arr = ['a', 'b', 'c', 'd', 'с'];
$flag = false; //считаем, что элемента 'c' нету в массиве
foreach ($arr as $elem) {
if ($elem == 'c') {
$flag = true; //элемент есть - переопределим переменную $flag
break;
}
}
if ($flag === true) {
echo 'Есть';
} else {
echo 'Нет';
}
?>
Таким образом и работают флаги. Запомните этот прием - он обязательно встретится вам в дальнейшем, причем неоднократно.
Флаги в функции
Когда мы работаем с пользовательскими функциями - флаги тоже можно и нужно использовать, но работа с ними упрощается. Давайте решим ту же задачу на 'c', но таким образом: необходимо создать функцию hasElem, которая параметром будет принимать массив и возвращать true, если 'c' есть в массиве, и false - если нет:
<?php
$arr = ['a', 'b', 'c', 'd', 'с'];
echo hasElem($arr); //выведет true или false
?>
Давайте реализуем функцию hasElem. В этом случае переменная flag и команда break нам не понадобится - вместо них все сделает команда return.
Как это будет: внутри функции запускаем наш цикл с ифом и, если мы попали в иф - делаем return true, тем самым выходя из цикла и из функции. А если цикл прокрутился, но выхода из функции не случилось - после цикла делаем return false:
<?php
function hasElem($arr)
{
foreach ($arr as $elem) {
if ($elem == 'c') {
return true;
}
}
return false; //элемент 'c' не найден
}
$arr = ['a', 'b', 'c', 'd', 'с'];
echo hasElem($arr);
?>
Еще раз как это работает: если в массиве найдется элемент со значением 'c' - мы выйдем из функции с помощью return. Но если в массиве не найдется элемент 'c' - выхода из функции не произойдет и выполнение дойдет до команды return false. И получится, что функция вернет false в знак того, что элемент 'c' не найден в массиве.