Práca s flagmi v PHP
Teraz sa naučíme pracovať s flagmi.
Flag je špeciálna premenná, ktorá
môže nadobúdať iba dve hodnoty: true
a false. Pomocou flagov môžeme riešiť
úlohy, ktoré overujú neprítomnosť niečoho:
napríklad môžeme overiť, či v poli
nie je prvok s určitou hodnotou. Poďme na to.
Poďme vyriešiť nasledujúcu úlohu: dané pole
s číslami, je potrebné overiť, či sa v ňom
nachádza prvok s hodnotou 3 alebo nie. Ak
áno - vypíšeme '+++', ak nie -
vypíšeme '---'.
Na začiatok skúsme vypísať '+++'.
Preto prejdeme všetky prvky nášho poľa
a pomocou ifu sa budeme pýtať - je aktuálny
prvok rovný hodnote 3. Ak áno - vypíšeme
'+++':
<?php
$arr = [1, 2, 3, 4, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++';
}
}
?>
Naše riešenie však nie je veľmi dobré: pretože ak
v poli bude nie jedna hodnota 3,
ale niekoľko, tak '+++' sa vypíše niekoľkokrát.
Poďme opraviť naše pole (urobme
dva prvky s hodnotou 3) a presvedčíme sa o tom:
<?php
$arr = [1, 2, 3, 4, 3, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++'; // vypíše niekoľkokrát
}
}
?>
Opravme problém: ukončíme cyklus pomocou
break, ak už bol prvok nájdený:
<?php
$arr = [1, 2, 3, 4, 3, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++';
break; // ukončíme cyklus
}
}
?>
Poďme sa teraz pokúsiť urobiť to, aby,
ak v poli nie sú vôbec žiadne prvky s hodnotou
3, vypísalo sa '---'. Bežnou
chybou je pridať else k
nášmu ifu - v takom prípade sa '---'
bude vypisovať pre všetky prvky, ktoré nie sú
3:
<?php
$arr = [1, 2, 3, 4, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++'; // vypíše na prvku 3
} else {
echo '---'; // vypíše na prvkoch 1, 2, 4, 5
}
}
?>
Takže, nápad pridať else - je zlý
nápad, nefunguje. Na riešenie úloh tohto
typu (takéto úlohy sa vyskytujú dosť
často) sa používajú takzvané flagy.
Ako už bolo spomenuté vyššie, flag je taká
premenná, ktorá môže nadobúdať dve hodnoty:
true alebo false.
Takže, urobme premennú flag
s takouto hodnotou: ak je rovná true,
tak v poli je prvok 3, a ak
false, tak taký prvok nie je.
Spočiatku nastavme premennú flag
na hodnotu false - teda budeme predpokladať,
že prvok 3 v poli nie je:
$arr = [1, 2, 3, 4, 5];
$flag = false; // predpokladáme, že prvok 3 nie je v poli
Potom spustíme cyklus s ifom tak, ako sme to robili
predtým. Ak cyklus zistí, že v poli
je prvok 3 - tak nastavíme premennú flag
na hodnotu true a ukončíme cyklus
pomocou break:
<?php
$arr = [1, 2, 3, 4, 5];
$flag = false; // predpokladáme, že prvok 3 nie je v poli
foreach ($arr as $elem) {
if ($elem === 3) {
$flag = true; // prvok je - predefinujeme premennú $flag
break; // ukončíme cyklus
}
}
?>
Odpoveď na otázku, či je v poli 3
alebo nie, môžeme dať až po cykle.
A túto odpoveď už máme: po cykle
premenná flag mohla zostať false
alebo mohla zmeniť svoju hodnotu na true,
ak cyklus objavil v poli 3:
<?php
$arr = [1, 2, 3, 4, 5];
$flag = false;
foreach ($arr as $elem) {
if ($elem === 3) {
$flag = true;
break;
}
}
// tu je premenná $flag rovná buď true, alebo false
?>
Teraz môžeme po cykle urobiť if, ktorý
sa pozrie na premennú flag a vypíše
na obrazovku '+++' alebo '---':
<?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 '---';
}
?>
Dané pole:
<?php
$arr = ['a', 'b', 'c', 'd', 'e'];
?>
Overte, či v tomto poli je prvok
'c'. Ak áno - vypíšte '+++',
a ak nie - vypíšte '---'.
Napíšte kód, ktorý bude overovať, či je číslo prvočíslo alebo nie. Prvočíslo je deliteľné iba jednotkou a sebou samým, a nie je deliteľné inými číslami.