Работа с флагове в 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 няма в масива:
$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'. Ако има - изведете '+++',
а ако няма - изведете '---'.
Напишете код, който ще проверява числото дали е просто или не. Простото число се дели само на единица и на себе си, и не се дели на други числа.