Работа со знамиња во 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; // елементот постои - ја reдефинираме променливата $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

Напишете код кој ќе проверува број дали е прост или не. Прост број се дели само на единица и на самиот себе, и не се дели на други броеви.