Zászlók kezelése PHP-ben

Most megtanuljuk, hogyan kell dolgozni a zászlókkal. A zászló egy speciális változó, amely csak két értéket vehet fel: true és false. A zászlók segítségével megoldhatunk olyan feladatokat, amelyek valaminek a hiányát ellenőrzik: például ellenőrizhetjük, hogy egy tömbben nincs-e egy adott értékű elem. Kezdjük is el.

Oldjuk meg a következő feladatot: adott egy tömb számokkal, ellenőrizni kell, hogy van-e benne 3 értékű elem vagy sem. Ha van - írjuk ki a '+++' szöveget, ha nincs - írjuk ki a '---' szöveget.

Először próbáljuk meg kiírni a '+++' szöveget. Ehhez menjünk végig a tömb összes elemén és egy feltétellel kérdezzük meg - egyenlő-e az aktuális elem a 3 értékkel. Ha egyenlő - írjuk ki a '+++' szöveget:

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

De a megoldásunk nem túl jó: hiszen ha a tömbben nem egy 3 érték lesz, hanem több, akkor a '+++' szöveg többször fog kiíródni. Módosítsuk a tömbünket (tegyünk két 3 értékű elemet bele), és győződjünk meg erről:

php<?php
  $arr = [1, 2, 3, 4, 3, 5];
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      echo '+++'; // többször fog kiíródni
    }
  }
?>

Javítsuk a problémát: szakítsuk meg a ciklust a break utasítással, ha az elemet már megtaláltuk:

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

Most próbáljuk meg úgy megoldani, hogy ha a tömben egyáltalán nincs 3 értékű elem, akkor a '---' szöveg jelenjen meg. Gyakori tévedés, ha hozzáadunk egy else ágat a feltételünkhöz - ebben az esetben a '---' szöveg minden olyan elemre kiíródik, amely nem 3:

php<?php
  $arr = [1, 2, 3, 4, 5];
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      echo '+++'; // a 3-as elemnél írja ki
    } else {
      echo '---'; // az 1, 2, 4, 5 elemeknél írja ki
    }
  }
?>

Tehát az else hozzáadásának ötlete - rossz ötlet, nem működik. Az ilyen típusú feladatok megoldására (az ilyen feladatok elég gyakoriak) használják az úgynevezett zászlókat.

Ahogy fentebb már említettük, a zászló - egy olyan változó, amely csak két értéket vehet fel: true vagy false.

Tehát készítsünk egy flag változót a következő jelentéssel: ha egyenlő true-val, akkor a tömbben van 3 értékű elem, ha pedig false, akkor nincs ilyen elem.

Kezdetben állítsuk a flag változót false értékre - azaz feltételezzük, hogy a 3 értékű elem nincs a tömbben:

javascript$arr = [1, 2, 3, 4, 5];
$flag = false; // feltételezzük, hogy a 3-as elem nincs a tömbben

Ezután indítsuk el a ciklust a feltétellel úgy, ahogy korábban tettük. Ha a ciklus detektálja, hogy a tömbben van 3 értékű elem - akkor állítsuk a flag változót true értékre és lépjünk ki a ciklusból a break utasítással:

php<?php
  $arr = [1, 2, 3, 4, 5];
  $flag = false; // feltételezzük, hogy a 3-as elem nincs a tömbben
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      $flag = true; // az elem megtalálva - újradefiniáljuk a $flag változót
      break; // kilépünk a ciklusból
    }
  }
?>

A kérdésre, hogy van-e a tömbben 3 értékű elem vagy sem, csak a ciklus után tudunk válaszolni. És ez a válasz már megvan: a ciklus után a flag változó vagy false marad, vagy az értéke true-ra változhat, ha a ciklus detektált a tömbben 3 értékű elemet:

php<?php
  $arr = [1, 2, 3, 4, 5];
  $flag = false;
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      $flag = true;
      break;
    }
  }
  
  // itt a $flag változó vagy true, vagy false
?>

Most a ciklus után készíthetünk egy feltételt, amely ránéz a flag változóra, és kiírja a '+++' vagy '---' szöveget:

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

Adott egy tömb:

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

Ellenőrizd, hogy ebben a tömbben van-e 'c' értékű elem. Ha van - írd ki a '+++' szöveget, ha nincs - írd ki a '---' szöveget.

Задание 2

Írj kódot, amely ellenőrzi, hogy egy szám prím-e vagy sem. Egy prímszám csak eggyel és önmagával osztható, és más számokkal nem osztható.