Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akci až 30 % zdarma při nákupu e-learningu - Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
C# week + discount 30

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šie 0, už vieme, že v programovaní všetko začína od nuly, nie od jednotky). Napr. teda $i = 0. Býva zvykom používať názov i, ako index.
  • 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é o 1.

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:

echo('Knock<br />');
echo('Knock<br />');
echo('Knock<br />');
echo('Penny!');

My ale už nič nemusíme otrocky opisovať:

for ($i=0; $i < 3; $i++)
{
    echo('Knock<br />');
}
echo('Penny!');

výsledok:

Your page
localhost

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ť:

for ($i = 1; $i <= 10; $i++)
    echo($i . ' ');

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 110, 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:

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>');

výstup:

Your page
localhost/loops

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:

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>');

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 110. 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:

$a = 2; // základ mocniny
$n = 3; // exponent

$vysledek = $a;
for ($i = 0; $i < ($n - 1); $i++)
    $vysledek = $vysledek * $a;

echo("Výsledok: $vysledek");

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á.

Your page
localhost

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:

$i = 1;
while ($i <= 10)
{
    echo($i . ' ');
    $i++;
}

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é 512x (1.54 kB)
Aplikácia je vrátane zdrojových kódov v jazyku php

 

Predchádzajúci článok
Skladanie stránok v PHP
Všetky články v sekcii
Základné konštrukcie jazyka PHP
Preskočiť článok
(neodporúčame)
Riešené úlohy k 7.-11. lekciu PHP
Článok pre vás napísal David Čápka
Avatar
Užívateľské hodnotenie:
1 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity

 

 

Komentáre

Avatar
Michal Šmahel:19.4.2015 22:41

Je tu někde uvedena možnost "přeskočení", například při výpisu násobilky se nevypíší čísla obsahující 5. Myslím toto:

continue

Pokud to tu někde je, omlouvám se, nevšiml jsem si.

Odpovedať
19.4.2015 22:41
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Ondřej Máca:22.6.2015 10:32

Ten příklad s mocninou bych udělal raději takto:

 $a = 2;               //zak
 $n = 3;               //exp
 $vysledek = 1;

 for($i=0; $i<$n; $i++)
   $vysledek *= $a;

echo "$vysledek";

Protože to vaše řešení nefunguje pro exponent 0. Samozřejmě že moje řešení také není dokonalé, nefungují u něj záporné exponenty, ale aspoň nějaké zlepšení to je :)

Editované 22.6.2015 10:34
 
Odpovedať
22.6.2015 10:32
Avatar
faj.er
Člen
Avatar
faj.er:24.6.2015 21:51

"Pokud si však nějakou proměnnou založíme v těle cyklu, po skončení cyklu zanikne a již nebude přístupná." To přece není pravda, to v PHP neplatí.

 
Odpovedať
24.6.2015 21:51
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovedá na faj.er
David Čápka:25.4.2017 21:22

Díky, opraveno :)

Odpovedať
25.4.2017 21:22
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
Avatar
Jiří Jordán:6.9.2017 20:19

Ahoj, mohli byste mi prosim nějak blíže vysvětlit ten příklad s vnější proměnnou, kde aplikace počítá ty mocniny? Jako jak to funguje, nedokážu si to moc představit. :) (jsem začátečník)

Editované 6.9.2017 20:21
 
Odpovedať
6.9.2017 20:19
Avatar
Nikol Nojmann:15.11.2017 11:08

Great, excellent, awsome.
Na kurzu jsem jenom opisovala a nechápala. Tady plně chápu a neopisuji, což je při mém věku super.
Díky.

 
Odpovedať
15.11.2017 11:08
Avatar
Odpovedá na Jiří Jordán
František Kreisinger:16.3.2018 19:16

Asi už začátečník nejsi a dávno jsi nejspíš přišel na to, že v tom nic není. Prostě se základ ($a) mezi sebou násobí tolikrát, kolik udává exponent ($n). Čítač cyklu ($i) začíná ne od 1 ale od nuly, takže musí skončit když dosáhne $n-1.

Odpovedať
16.3.2018 19:16
Začátečník v PHP, HTML i webovém programování vůbec.
Avatar
František Červeňák:4.1.2021 22:11

dobre, a názorne vysvetlené cyklické funkcie :-)

 
Odpovedať
4.1.2021 22:11
Avatar
Luděk Štrobl:12. apríla 19:11

K výpočtu mocniny a na n lze použít zkrácený zápis (operátor **):

$a = 2 //mocněnec
$n = 3 //mocnitel
$c = $a**$n //c = a na n
 
Odpovedať
12. apríla 19:11
Avatar
Lukáš Hrabovský:22. septembra 20:29

Vylepšil bych zobrazení nasobilky v tabulkách po stisku tlačítka “Vyzkoušet” protože barevné rozvržení není ideální.

 
Odpovedať
22. septembra 20:29
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!