Работа с флагами в PHP

Сейчас мы с вами научимся работать с флагами. Флаг - это специальная переменная, которое может принимать только два значения: true или false. С помощью флагов можно решать задачи, проверяющие отсутствие чего-либо: к примеру, можно проверить, что в массиве нет элемента с определенным значением.

Давайте решим следующую задачу: дан массив с числами, нужно проверить, есть ли в нем элемент со значением 3 или нет. Если есть - выведем 'есть', если нет - выведем 'нет'.

Шаг первый

Для начала давайте попробуем вывести 'есть'. Для этого переберем все элементы нашего массива и ифом будем спрашивать - равен ли текущий элемент значению 3. Если равен - выведем 'есть':

<?php $arr = [1, 2, 3, 4, 5]; foreach ($arr as $elem) { if ($elem === 3) { echo 'есть'; } } ?>

Но наше решение не очень хорошо: ведь если в массиве будет не одно значение 3, а несколько, то 'есть' выведется несколько раз. Давайте исправим наш массив (сделаем два элемента со значением 3) и убедимся в этом:

<?php $arr = [1, 2, 3, 4, 3, 5]; foreach ($arr as $elem) { if ($elem === 3) { echo 'есть'; // выведет несколько раз } } ?>

Поправим проблему: завершим цикл с помощью break, если элемент уже найден:

<?php $arr = [1, 2, 3, 4, 3, 5]; foreach ($arr as $elem) { if ($elem === 3) { echo 'есть'; break; // завершим цикл } } ?>

Шаг второй

Давайте теперь попробуем сделать так, чтобы, если в массиве вообще нет элементов со значением 3, выводилось 'нет'. Распространенным заблуждением будет добавить else к нашему ифу - в этом случае 'нет' будет выводиться на все элементы, не являющиеся 3:

<?php $arr = [1, 2, 3, 4, 5]; foreach ($arr as $elem) { if ($elem === 3) { echo 'есть'; // выведет на элементе 3 } else { echo 'нет'; // выведет на элементах 1, 2, 4, 5 } } ?>

Итак, идея добавить else - плохая идея, не рабочая. Для решения задач подобного типа и используют переменные-флаги.

Давайте сделаем такую переменную со следующем поведением: если она равна true, то в массиве есть элемент 3, а если false, то такого элемента нет. Изначально поставим наш флаг в значение false - то есть будем считать, что элемента 3 в массиве нет:

<?php $arr = [1, 2, 3, 4, 5]; $flag = false; // считаем, что элемента 3 в массиве нет ?>

Затем запустим цикл с ифом так, как мы делали это раньше. Если цикл обнаружит, что в массиве есть элемент 3 - то поставим переменную $flag в значение true и выйдем из цикла с помощью break:

<?php $arr = [1, 2, 3, 4, 5]; $flag = false; // считаем, что элемента 3 нет в массиве foreach ($arr as $elem) { if ($elem === 3) { $flag = true; // элемент есть - переопределим переменную $flag break; // выйдем из цикла } } ?>

Ответ на вопрос, есть ли в массиве 3 или нет, мы можем дать только после цикла. И этот ответ у нас уже есть: после цикла переменная $flag могла остаться false или могла сменить свое значение на true, если цикл обнаружил в массиве 3:

<?php $arr = [1, 2, 3, 4, 5]; $flag = false; foreach ($arr as $elem) { if ($elem === 3) { $flag = true; break; } } // тут переменная $flag равна или true, или false ?>

Теперь после цикла мы можем сделать иф, который посмотрит на переменную $flag и выведет на экран 'есть' или 'нет':

<?php $arr = [1, 2, 3, 4, 5]; $flag = false; foreach ($arr as $elem) { if ($elem === 3) { $flag = true; break; } } if ($flag === true) { echo 'есть'; } else { echo 'нет'; } ?>

Дан массив:

<?php $arr = ['a', 'b', 'c', 'd', 'e']; ?>

Проверьте, что в этом массиве есть элемент 'c'. Если есть - выведите 'да', а если нет - выведите 'нет'.