Cykly
O niekoľko kapitol skorej sme sa naučili používať cyklus FOR, pomocou ktorého vieme presný počet krát zopakovať nejaký činnosť, resp. sekvenciu (skupinu) príkazov. Ak si spomínate, na začiatku sme museli nadefinovať hodnotu nejakej premennej, ktorú sme každým krokom v našej ukážke zvyšovali a pomocou správne zadanej podmienky sme určili, kedy má cyklus skončiť. Tým, že sme dopredu určovali túto podmienku, sme vedeli presne zabezpečiť, že sa cyklus zopakoval toľkokrát, koľkokrát sme chceli, čiže sme mali dopredu pevný počet opakovaní. A presne na základe tohto faktu sa tento cyklus (for) volá cyklus s pevným počtom opakovaní. Uznávam, že pochopiť tento cyklus bolo na začiatok dosť náročné a že jeho zápis vyzerá sprvu dosť neprehľadne. Ale je to veľmi používaná vec a tak sa mu nevyhneme, bolo lepšie prejsť si ho čím skôr.
Okrem tohto cyklu ešte poznáme ďalšie dva cykly, ktoré sú si dosť podobné a ich zápis, resp. použitie je troška jednoduchšie ako pri cykle for. Tieto dva cykly sa od cyklu for odlišujú tým, že nemajú pevne daný počet opakovaní. Pri zápise tohto cyklu neurčujeme ničím presne, koľkokrát sa to má zopakovať, ako to bolo pri cykle for. V týchto dvoch cykloch sa iba zapisuje podmienka, ktorá ak je splnená, cyklus pokračuje, ak nie, cyklus končí. Premenné, resp. niečo, čo môže ovplyvniť túto podmienku, sa vo väčšine upravuje v tele cyklu. Tým, že neurčujeme dopredu pevný počet opakovaní, je nutné dať pozor na to, aby sa nám podmienka po istom čase nesplnila, inak dospejeme k nekončenému cyklu. Rozdiel medzi týmito dvomi cyklami je len v tom, že pri jednom je podmienka na začiatku a pri druhom na konci. Poďme si ich teda ukázať.
Prvý cyklus sa v starších jazykoch zvykol volať repeat – until (opakuj – pokiaľ), v jazyku php sa volá do – while (rob – kým). Ako hovorí jeho názov, cyklus bude niečo robiť – vykonávať blok príkazov, kým bude splnená podmienka na konci. To, že je podmienka na konci je dôležité, pretože tento cyklus sa inak volá cyklus s podmienkou na konci. Prečo je to také dôležité? Zápis cyklu vyzerá nasledovne, za slovom do nasledujú množinové zátvorky, ktoré obsahujú blok príkazov, ktoré sa majú vykonať v jednom kroku cyklu. Za nimi nasleduje slovo while (kým) a v okrúhlych zátvorkách podmienka, za ktorou nasleduje bodkočiarka. Tým, že za slovom je hneď blok príkazov, tieto príkazy sa okamžite po spustení cyklus spustia aspoň raz, aj keď je podmienka nesplnená, pretože na jej výsledok sa pýtame až na konci. Čiže postup tohto cyklu je nasledovný, vykonaj raz príkazy, spýtaj sa na podmienku. Ak neplatí, cyklus končí, ak platí, cyklus ide ďalej druhým krokom a takto ďalej, až kým nebude podmienka splnená. Možno teraz nevidíte význam v tom, že spušťame niečo aspoň raz aj keď je podmienka nesplnená, ale časom určite narazíme na prípady, kedy sa to hodí. Pozrime sa na príklad:
<?php
$i = 0;
//cyklus s nesplnenou podmienkou
do {
echo "Chcem jest!";
echo "<br>";
} while (false);
//cyklus s docasne splnenou podmienkou
do {
echo "Som hladnyyy!";
echo "<br>";
$i = $i + 1;
} while ($i < 5);
V prvom prípade máme cyklus, ktorý nemá splnenú podmienku a v druhom prípade sme sa snažili napodobniť cyklus for. Mimo cyklu sme si zadeklarovali premennú i, ktorá bude slúžiť ako počítadlo, podobne ako to bolo pri cykle for. V tele cyklu túto premenné každým krokom zvyšujeme o jedna a na konci cyklu máme podmienku. Pomocou zmeny tohto čísla dosiahneme, že sa cyklus zopakuje vždy toľkokrát, aké sa tam nachádza číslo. Nateraz sa vám to môže zdať to isté, ako cyklus for a nevidíte v tom význam. Skúste si ale predstaviť situáciu, že chceme napríklad od používateľa, aby zadal správne heslo. Vypíšeme mu hlášku Zadaj správne heslo! a pokiaľ ho nezadá, tak mu to stále budeme vypisovať, takže toto by sa cyklom for nedalo vyriešiť, neviem dopredu, koľkokrát zadá to zlé. Ale týmto cyklom by sme sa iba pýtali v tele, či zadal správne heslo, ak nie, tak naša premenná v podmienke by bola napríklad false a stále by dostal hlášku o zadaní hesla. Ak by zadal správne heslo (overovanie by bolo tiež v tele cyklu), tak by sme túto premennú nastavili na hodnotu true, cyklus by skončil a program by pokračoval ďalej.
Druhý cyklus je veľmi podobný, len sa mení pozícia podmienky, takže to bude cyklus s podmienkou na začiatku. Jeho názov je while (kým, pokým), dalo by sa to preložiť ako, pokiaľ platí toto, tak rob toto. Tým, že je podmienka na začiatku a pýtame sa na ňu predtým, ako ide kód, môže sa stať, že sa cyklus nevykoná ani raz (v prípade nesplnenia podmienky). Zápis je teda nasledovný, za slovom while nasleduje podmienka v okrúhlych zátvorkách a za ňou blok príkazov v množinových zátvorkách s bodkočiarkou na konci:
<?php
$i = 0;
//cyklus s nesplnenou podmienkou
while (false) {
echo "Chcem jest!";
echo "<br>";
};
//cyklus s docasne splnenou podmienkou
while ($i < 5) {
echo "Som hladnyyy!";
echo "<br>";
$i = $i + 1;
};
Rozdiel vo výsledku od predošlej ukážky je ten, že v tomto prípade pri nesplnenej podmienke sa cyklus nevykoná ani raz. Na záver základnej sekcie jazyka PHP si ukážeme ešte rozšírenejší spôsob zadávania podmienok, resp. zadávanie zložitejších podmienok (dve a viac podmienok naraz). Neviem ako ste na tom s vedomosťami z matematiky strednej školy a či si pamätáte niečo okolo výrokovej logiky. Preberalo sa tam niečo o výrokoch, boli to vety, ktorým sme vedeli priradiť pravdivostnú hodnotu, čiže či sú pravadivé (true) alebo nepravdivé (false). Niečo podobné sú naše podmienky, ktoré využívame v príkaze if alebo v cykloch. Existujú však aj zložené výroky, ktoré sa skladajú z dvoch a viacerých viet. Medzi nimi sú logické operátory, ktoré určuje vzťah jednotlivých výrokov medzi sebou a je logicky určené, kedy je takýto zložený výrok (podmienka) pravdivý alebo nie.
Práve pomocou týchto logických operátorov budeme aj my skladať zložené podmienky, čiže podmienky, ktoré sa budú skladať z dvoch a viacerých podmienok. Pre splnenie podmienky musí platiť celý výraz, celá zložená podmienka. Na to, aby sme to vedeli vyhodnotiť, musíme vedieť, kedy čo platí. Prvým takýmto vzťahom medzi dvomi podmienka je vzťah a/a súčasne (AND) – Dnes som vstal a je streda. Takýto vzťah je pravdivý len v prípade, ak sú splnené všetky podmienky, tažke v tomto prípade som vstal a musí byť aj streda. Ak aspoň jeden (1 a viac) z výrokov v danom zloženom výroku neplatí, neplatí celý výrok. Pre nás výrok predstavuje podmienku, takže si to môžeme predstaviť ako napríklad x je väčšie ak 5 a súčasne je menšie ako 23. Musí platiť aj jedno aj druhé, inak nie je podmienka logicky splnená, pretože tam máme a (and). Práve slovo AND je logický operátor tohto vzťahu. Namiesto slova AND môžeme použiť pre vzťah a súčasne dva znaky ampersand za sebou (&&).
Druhý vzťah, ktorý si prestavíme, je vzťah alebo (OR). Alebo ideme do mesta alebo budeme piť doma. Celý výrok je splnený, ak sa splní aspoň jedna z uvedených možností medzi slovom alebo. Takže ak pôjdeme do mesta, je splnený celý zložený výraz, takisto ak budeme piť doma. Namiesto slova OR môžeme použiť pre vzťah alebo dva znaky zvislej čiarky za sebou (||).
Tretí vzťah, ktorý si ukážeme je negácia – not (nie). Tento operand neguje daný výrok, takže ak by sme negovali výrok true, výsledok by bol false. Ak by sme negovali napríklad výrok x je väčšie ako 5, dostaneme výrok x je menšie rovné piatim. Výsledok takejto podmienky sa ráta teda po znegovaní. Poďme si jednotlivé prípady ukázať na praktickej ukážke, aby sme to ľahšie pochopili:
<?php
$a = 5;
$b = 7;
$c = TRUE;
if($a > 2 AND $a < 5){
echo "1 - Podmienka je splnena.";
echo "<br>"; echo "<br>";
}else{
echo "1 - Podmienka nie je splnena.";
echo "<br>"; echo "<br>";
}
if($a > 2 AND $a < 20 && $a == 5){
echo "2 - Podmienka je splnena.";
echo "<br>"; echo "<br>";
}else{
echo "2 - Podmienka nie je splnena.";
echo "<br>"; echo "<br>";
}
if($a > 6 OR $b > 5){
echo "3 - Podmienka je splnena.";
echo "<br>"; echo "<br>";
}else{
echo "3 - Podmienka nie je splnena.";
echo "<br>"; echo "<br>";
}
if(!$c){
echo "4 - Podmienka je splnena.";
echo "<br>"; echo "<br>";
}else{
echo "4 - Podmienka nie je splnena.";
echo "<br>"; echo "<br>";
}
V prvom prípade neplatí výraz a < 5 , pretože a je práve 5, takže celá podmienka a súčasne neplatí (musia platiť všetky). Druhá podmienka je splnená, pretože platia všetky tri výrazy, medzi ktorými je vzťah and. Všimnite si, že tento operand môžeme zapísať slovom and alebo aj dvomi znakmi ampersand (&). Tretí výraz používa logicky operátor alebo (OR), takže stačí, aby bola aspoň jedna z podmienok splnená a platí celý výraz. V poslednom prípade sme použili negáciu. Aj keď je premenná c pravda, negujeme ju pomocou znaku výkričníka (znak negácie), takže sa z nej stáva false a to je nepravda, takže podmienka nie je splnená. Pozor na to, že hodnota tejto premennej je aj tak pravda, pretože negáciu sme nepriradili do danej premennej ($c = !$c), iba ju negujeme v podmienke, takže jej pôvodná hodnota ostáva.