11. diel - Cykly for a while v PHP
V minulej lekcii, Skladanie stránok v PHP , sme sa naučili, ako nielen do
index.php
vkladať obsah nejakého súboru alebo skriptu. Dnes si v
PHP tutoriálu vysvetlíme cykly, ktoré budeme v budúcnosti používať najmä
pre prácu s dátami z databázy.
Cyklus
Ako už slovo cyklus napovie, niečo sa bude opakovať. Keď chceme v programe niečo urobiť 100x, určite nebudeme písať pod seba 100x ten istý kód, ale vložíme ho do cyklu. Cyklov máme niekoľko druhov, vysvetlíme si, kedy ktorý použiť. Samozrejme si ukážeme praktické príklady.
for
cyklus
Tento cyklus má stanovený pevný počet opakovaní a
hlavne obsahuje tzv. Riadiace premennú (celočíselnú), v ktorej sa postupne
počas behu cyklu menia hodnoty. Syntax (zápis) cyklu for
je
nasledovná:
for (premenna; podmienka; prikaz)
premenna
je riadiaca premenná cyklu, ktoré nastavíme počiatočnú hodnotu (najčastejšie0
, už vieme, že v programovaní všetko začína od nuly, nie od jednotky). Napr. teda$i = 0
. Býva zvykom používať názovi
, akoindex
.podmienka
je podmienka vykonanie ďalšieho kroku cyklu. Akonáhle nebude platiť, cyklus sa ukončí. Podmienka môže byť napr ($i < 10
).prikaz
nám hovorí, čo sa má v každom kroku s riadiacou premennou stáť. Teda či sa má zvýšiť alebo znížiť. K tomu využijeme špeciálnych príkazov++
a--
, tie samozrejme môžete používať aj úplne bežne mimo cyklus, slúži na zvýšenie alebo zníženie premenné o1
.
Poďme si urobiť jednoduchý príklad, väčšina z nás určite pozná Sheldona z The Big Bang Theory. Pre tých čo nie, budeme simulovať situáciu, kedy klope na dvere svojej susedky. Vždy 3x zaklope a potom zavolá: "Penny!". Náš kód by bez cyklov vyzeral takto:
{PHP}
echo('Knock<br />');
echo('Knock<br />');
echo('Knock<br />');
echo('Penny!');
{/PHP}
My ale už nič nemusíme otrocky opisovať:
{PHP}
for ($i=0; $i < 3; $i++)
{
echo('Knock<br />');
}
echo('Penny!');
{/PHP}
výsledok:
Cyklus prebehne 3x, spočiatku je v premennej $i
nula, cyklus
vypíše "Knock" a zvýši premennú $i
o jedna. Potom beží
rovnako s jednotkou a dvojkou. Akonáhle je v $i
trojka, už
nesúhlasí podmienka $i < 3
a cyklus končí. O vynechávanie
zložených zátvoriek platí to isté, čo u podmienok. V tomto prípade tam
nemusí byť, pretože cyklus spúšťa iba jediný príkaz. Teraz môžeme
miesto trojky napísať do deklarácie cyklu desiatku. Príkaz sa spustí 10x
bez toho aby sme písali niečo navyše. Určite vidíte, že cykly sú mocným
nástrojom.
Skúsme si teraz využiť to, že sa nám premenná inkrementuje. Vypíšme si čísla od jednej do desať:
{PHP}
for ($i = 1; $i <= 10; $i++)
echo($i . ' ');
{/PHP}
Vidíme, že riadiaci premenná má naozaj v každej iterácii (priebehu)
inú hodnotu. Všimnite si, že v cykle tentoraz nezačíname na nule, ale
môžeme nastaviť počiatočnú hodnotu na 1
a koncovú na
10
. V programovaní je však zvykom začínať od nuly, pretože sa
od nuly indexujú poľa.
Teraz si vypíšeme malú násobilku (násobky čísel 1
až
10
, vždy do desať). Stačí nám urobiť cyklus od 1
do 10
a kontrolnej premennú vždy násobiť daným číslom. Mohlo
by to vyzerať asi takto:
{PHP}
echo('<h1>Malá násobilka pomocou cyklu</h1>');
echo('<table border="1"><tr>');
for ($i = 1; $i <= 10; $i++)
echo('<td>' . $i . '</td>');
echo('</tr><tr>');
for ($i = 1; $i <= 10; $i++)
echo('<td>' . ($i * 2) . '</td>');
echo('</tr><tr>');
for ($i = 1; $i <= 10; $i++)
echo('<td>' . ($i * 3) . '</td>');
echo('</tr><tr>');
for ($i = 1; $i <= 10; $i++)
echo('<td>' . ($i * 4) . '</td>');
echo('</tr><tr>');
for ($i = 1; $i <= 10; $i++)
echo('<td>' . ($i * 5) . '</td>');
echo('</tr><tr>');
for ($i = 1; $i <= 10; $i++)
echo('<td>' . ($i * 6) . '</td>');
echo('</tr><tr>');
for ($i = 1; $i <= 10; $i++)
echo('<td>' . ($i * 7) . '</td>');
echo('</tr><tr>');
for ($i = 1; $i <= 10; $i++)
echo('<td>' . ($i * 8) . '</td>');
echo('</tr><tr>');
for ($i = 1; $i <= 10; $i++)
echo('<td>' . ($i * 9) . '</td>');
echo('</tr><tr>');
for ($i = 1; $i <= 10; $i++)
echo('<td>' . ($i * 10) . '</td>');
echo('</tr></table>');
{/PHP}
výstup:
Program funguje pekne, ale stále sme toho dosť napísali. Ak vás napadlo, že v podstate robíme 10x to isté a len zvyšujeme číslo, ktorým násobíme, máte pravdu. Nič nám nebráni vložiť 2 cykly do seba:
{PHP}
echo('<h1>Malá násobilka pomocou cyklu</h1>');
echo('<table border="1">');
for ($j = 1; $j <= 10; $j++)
{
echo('<tr>');
for ($i = 1; $i <= 10; $i++)
echo('<td>' . ($i * $j) . '</td>');
echo('</tr>');
}
echo('</table>');
{/PHP}
Pomerne zásadný rozdiel, že? Pochopiteľne nemôžeme použiť u oboch
cyklov $i
, pretože sú vložené do seba. Premenná
$j
nadobúda vo vonkajšom cykle hodnoty 1
až
10
. V každej iterácii (rozumejte priebehu) cyklu je potom
spustený ďalší cyklus s premennou $i
. Ten je nám už známy,
vypíše násobky, v tomto prípade násobíme premennú $j
. Po
každom behu vnútorného cyklu je tiež potrebné otvoriť a ukončiť nový
riadok.
Urobme si ešte jeden program, na ktorom si ukážeme prácu s vonkajšou premennou. Aplikácia bude vedieť spočítať ľubovoľnú mocninu ľubovoľného čísla:
{PHP}
$a = 2; // základ mocniny
$n = 3; // exponent
$vysledek = $a;
for ($i = 0; $i < ($n - 1); $i++)
$vysledek = $vysledek * $a;
echo("Výsledok: $vysledek");
{/PHP}
Asi všetci tušíme, ako funguje mocnina. Pre istotu pripomeniem, že
napríklad 2^3 = 2 * 2 * 2
. Teda a^n
spočítame tak,
že n-1
krát vynásobíme číslo $a
číslom
$a
. Výsledok si samozrejme musíme ukladať do premennej.
Spočiatku bude mať hodnotu $a
a postupne sa bude v cykle
pronásobovat. Ak ste to nestihli, máme tu samozrejme článok s
algoritmom výpočtu ľubovoľnej mocniny. Vidíme, že naša premenná
$vysledek
je v tele cyklu normálne prístupná.
Na výpočet mocniny slúžia v PHP funkcie pow()
, v našom
prípade by sme ju volali ako pow(2, 3)
. Tým, že sme si ju
vytvorili sami sme si však ukázali, na čo sa for
cyklus
využíva. Zapamätajme si, že je počet opakovaní pevne
daný. Do premennej cyklu by sme nemali nijako zasahovať ani
dosadzovať, program by sa mohol tzv. Zacykliť, skúsme si ešte posledný,
odstrašujúci príklad:
// tento kód je zle for ($i = 1; $i <= 10; $i++) $i = 1;
Au, vidíme, že program sa zasekol. Cyklus stále inkrementuje premennú
$i
, ale tá sa vždy zníži na 1
. Nikdy teda
nedosiahne hodnoty > 10
, cyklus nikdy neskončí. Skript bude po
niekoľkých sekundách zastavený, pretože prekročil časový limit,
nastavený v php.ini
.
while
cyklus
Cyklus while
funguje inak, jednoducho opakuje príkazy v bloku
kým platí podmienka. Syntax cyklu je nasledovné:
while (podminka) { // príkazy }
Ak vás napadá, že možno cez while
cyklus urobiť aj
for
cyklus, máte pravdu for
je vlastne špeciálny prípad while
cyklu. while
sa ale používa na trochu iné veci, často máme v
jeho podmienke napr. funkciu vracajúci logickú hodnotu true
/
false
. Pôvodný príklad z for
cyklu by sme urobili
nasledovne pomocou while
:
{PHP}
$i = 1;
while ($i <= 10)
{
echo($i . ' ');
$i++;
}
{/PHP}
To ale nie je ideálne použitie while
cyklu. while
sa používa najmä v prípadoch, keď čítame zo súborov a nevieme, kedy
narazíme na posledný riadok. To si však ukážeme až neskôr.
V budúcej lekcii, Riešené úlohy k 7.-11. lekciu PHP , sa pozrieme na to, ako cykly používať pri
práci s poľami. Predstavíme si tiež posledný cyklus foreach
a
uvedieme si zoznam PHP funkcií pre prácu s poľami. Dnešné kód je ku
stiahnutý nižšie.
V nasledujúcom cvičení, Riešené úlohy k 7.-11. lekciu PHP, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 568x (1.67 kB)
Aplikácia je vrátane zdrojových kódov v jazyku php