Сейчас мы с вами научимся работать с флагами. Флаг - это специальная переменная, которое может принимать только два значения: 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' не найден в массиве.