Работа с флагове в PHP

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

Нека решим следната задача: даден е масив с числа, трябва да се провери дали в него има елемент със стойност 3 или не. Ако има - ще изведем '+++', ако няма - ще изведем '---'.

Като начало нека се опитаме да изведем '+++'. За това ще обходим всички елементи на нашия масив и с условна конструкция ще питаме - равен ли е текущият елемент на стойността 3. Ако е равен - ще изведем '+++':

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

Но нашето решение не е много добро: защото ако в масива има не една стойност 3, а няколко, то '+++' ще се изведе няколко пъти. Нека поправим нашия масив (ще направим два елемента със стойност 3) и ще се убедим в това:

php<?php
  $arr = [1, 2, 3, 4, 3, 5];
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      echo '+++'; // ще изведе няколко пъти
    }
  }
?>

Нека поправим проблема: ще прекратим цикъла с помощта на break, ако елементът вече е намерен:

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

Сега нека се опитаме да направим така, че, ако в масива изобщо няма елементи със стойност 3, да се извежда '---'. Често срещано заблуждение е да се добави else към нашата условна конструкция - в този случай '---' ще се извежда за всички елементи, които не са 3:

php<?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 няма в масива:

javascript$arr = [1, 2, 3, 4, 5];
$flag = false; // считаме, че елемент 3 го няма в масива

След това ще стартираме цикъл с условна конструкция така, както го правехме преди. Ако цикълът открие, че в масива има елемент 3 - тогава ще зададем променливата flag на стойност true и ще излезем от цикъла с break:

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

Сега след цикъла можем да направим условна конструкция, която ще погледне променливата flag и ще изведе на екрана '+++' или '---':

php<?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<?php
  $arr = ['a', 'b', 'c', 'd', 'e'];
?>

Проверете дали в този масив има елемент 'c'. Ако има - изведете '+++', а ако няма - изведете '---'.

Задание 2

Напишете код, който ще проверява числото дали е просто или не. Простото число се дели само на единица и на себе си, и не се дели на други числа.