Работа с флагами в 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 или false.
Итак, давайте сделаем переменную flag с таким значением: если она равна true, то в массиве есть элемент 3, а если false, то такого элемента нет.
Изначально поставим переменную flag в значение false - то есть будем считать, что элемента 3 в массиве нет:
let arr = [1, 2, 3, 4, 5];
let 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 '---';
}
?>
№1
Дан массив:
<?php
$arr = ['a', 'b', 'c', 'd', 'e'];
?>
Проверьте, что в этом массиве есть элемент 'c'. Если есть - выведите '+++', а если нет - выведите '---'.
№2
Напишите код, который будет проверять число на то, простое оно или нет. Простое число делится только на единицу и на само себя, и не делится на другие числа.