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
$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
$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
$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
$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:
$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
$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
$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
$arr = [1, 2, 3, 4, 5];
$flag = false;
foreach ($arr as $elem) {
if ($elem === 3) {
$flag = true;
break;
}
}
if ($flag === true) {
echo '+++';
} else {
echo '---';
}
?>
Adott egy tömb:
<?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.
Í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ó.