Rad sa zastavicama (flag-ovima) u PHP-u

Sada ćemo naučiti da radimo sa zastavicama (flag-ovima). Zastavica (flag) je specijalna promenljiva koja može imati samo dve vrednosti: true i false. Pomoću zastavica mogu se rešavati zadaci koji proveravaju odsustvo nečega: na primer, može se proveriti da li u nizu postoji element sa određenom vrednošću. Hajde da započnemo.

Hajde da rešimo sledeći zadatak: dat je niz sa brojevima, treba proveriti da li u njemu postoji element sa vrednošću 3 ili ne. Ako postoji - ispisaćemo '+++', ako ne - ispisaćemo '---'.

Za početak, hajde da pokušamo da ispišemo '+++'. Za to ćemo proći kroz sve elemente našeg niza i if-om ćemo pitati - da li je trenutni element jednak vrednosti 3. Ako jeste - ispisaćemo '+++':

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

Ali naše rešenje nije baš dobro: jer ako u nizu bude ne jedna vrednost 3, nego nekoliko, onda će se '+++' ispisati nekoliko puta. Hajde da ispravimo naš niz (napravimo dva elementa sa vrednošću 3) i uverimo se u to:

php<?php
  $arr = [1, 2, 3, 4, 3, 5];
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      echo '+++'; // ispisaće se nekoliko puta
    }
  }
?>

Ispravimo problem: prekinimo petlju pomoću break, ako je element već pronađen:

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

Hajde sada da pokušamo da uradimo tako da, ako u nizu uopšte nema elemenata sa vrednošću 3, ispiše se '---'. Česta greška je dodati else našem if-u - u tom slučaju će se '---' ispisivati za sve elemente koji nisu 3:

php<?php
  $arr = [1, 2, 3, 4, 5];
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      echo '+++'; // ispisaće se na elementu 3
    } else {
      echo '---'; // ispisaće se na elementima 1, 2, 4, 5
    }
  }
?>

Dakle, ideja da se doda else - loša je ideja, ne funkcioniše. Za rešavanje zadataka ovog tipa (takvi zadaci se sreću dovoljno često) koriste se takozvane zastavice (flag-ovi).

Kao što je već pomenuto, zastavica (flag) je takva promenljiva, koja može imati dve vrednosti: true ili false.

Dakle, hajde da napravimo promenljivu flag sa ovakvim značenjem: ako je jednaka true, onda u nizu postoji element 3, a ako je false, onda takvog elementa nema.

Inicijalno ćemo postaviti promenljivu flag na vrednost false - to jest smatraćemo, da elementa 3 u nizu nema:

javascript$arr = [1, 2, 3, 4, 5];
$flag = false; // smatramo da elementa 3 nema u nizu

Zatim ćemo pokrenuti petlju sa if-om onako kako smo to radili ranije. Ako petlja otkrije da u nizu postoji element 3 - onda ćemo postaviti promenljivu flag na vrednost true i izaći iz petlje pomoću break:

php<?php
  $arr = [1, 2, 3, 4, 5];
  $flag = false; // smatramo da elementa 3 nema u nizu
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      $flag = true; // element postoji - redefinišemo promenljivu $flag
      break; // izlazimo iz petlje
    }
  }
?>

Odgovor na pitanje, da li u nizu postoji 3 ili ne, možemo dati tek nakon petlje. I taj odgovor već imamo: nakon petlje promenljiva flag je mogla ostati false ili je mogla promeniti svoju vrednost na true, ako je petlja otkrila u nizu 3:

php<?php
  $arr = [1, 2, 3, 4, 5];
  $flag = false;
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      $flag = true;
      break;
    }
  }
  
  // ovde je promenljiva $flag jednaka ili true, ili false
?>

Sada nakon petlje možemo napraviti if, koji će pogledati promenljivu flag i ispisati na ekran '+++' ili '---':

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

Dat je niz:

php<?php
  $arr = ['a', 'b', 'c', 'd', 'e'];
?>

Proverite da li u ovom nizu postoji element 'c'. Ako postoji - ispišite '+++', a ako ne - ispišite '---'.

Задание 2

Napišite kod koji će proveravati broj na to, da li je prost ili nije. Prost broj deli se samo sa jedinicom i sa samim sobom, i ne deli se drugim brojevima.