Dnes si vezmeme na paškál cykly.
Dnes se podíváme na cykly. Cykly umožňují opakování určité části programu. Dohromady máme tři druhy cyklů: while, do-while a for.
While
Začneme u toho nejjednoduššího cyklu - while. While má velmi jednoduchou syntaxi a provádí se tak dlouho dokud platí podmínka. Zápis příkazů můžeme uskutečnit pomocí již známého bloku nebo jen tak (pouze ale v případě jednoho příkazu!) nebo prostřednictvím alternativního zápisu (dvojtečky a ukončujícího příkazu endwhile). // způsob zápisu jednoho příkazu
Tyto tři způsoby zápisu jsou shodné u většiny cyklů, podmínek apod. Já používám první dva způsoby zápisu, především kvůli přehlednosti (PSPad mi zvýrazňuje počáteční i koncovou závorku, takže v tom mám pořádek; u prvního způsobu nepotřebuji závorky - zase o něco kratší zápis kódu). Příklad je docela pěkný uveden již ve 13. díle tohoto seriálu, takže se podívejte na něj. Další není potřeba.
while (podminka)
prikaz;
// způsob zápisu více příkazů v cyklu prostřednictvím složených závorek (bloku)
while (podminka)
{
prikaz1;
prikaz2;
}
// způsob zápisu více příkazů v cyklu prostřednictvím alternativního zápisu
while (podminka):
prikaz1;
prikaz2;
endwhile;
Do-while
Za zmínku také rozhodně stojí cyklus do-while. Narozdíl od cyklu while, který se provede pouze v případě, že platí podmínka, se provede vždy alespoň jednou. Teprve potom se prověřuje, zda platí podmínka. To je v mnohých případech užitečné. do {
V příkladu generujeme náhodné číslo pomocí funkce mt_rand() s parametry 5 a 30 (zde určují interval pro generovaná čísla) - náhodné generování čísel si rozebereme v některém jiném díle tohoto seriálu. Funkce nám sice generuje čísla, ale my nechceme, aby byla dělitelná sedmi (tj. čísla 7,14,21 a 28). Proto nejprve provedeme generování čísla a teprve poté ověřujeme, zda není dělitelné sedmi. Není-li, je vše v pořádku a cyklus se ukončí.
prikaz1;
prikaz2;
} while (podminka);
// příklad
do {
$nahodne_cislo = mt_rand(5, 30);
} while (!($nahodne cislo % 7));
For
Cyklus for v podstatě dělá to samé, co ostatní cykly, ale dává nám možnost si potřebné proměnné apod. vytvořit uceleně, pod kontrolou: for(výraz1; výraz2; výraz3)
U tohoto cyklu můžete navíc některý výraz z hlavičky odstranit, dokonce můžete vypustit všechny (viz. nekonečný cyklus), nebo naopak můžete zadat příkazů více a oddělit je čárkou, např.
příkaz;
// výraz1: inicializace čítací proměnné, např. $i = 0;
// výraz2: vlastní podmínka cyklu, např. $i < 10;
// výraz3: změna hodnoty čítací proměnné, např. $i++
// příklad
for ($i = 1; $i < 7; $i++)
echo "Tohle je nadpis $i. úrovně ";
for ($i = 0, $j = 100; $i hodnota) příkaz;
Nezáleží přitom na tom, jak si pojmenujeme proměnné pro uložení hodnoty, resp. indexu. Využití tohoto cyklu je veliké, uvedeme si jeden příklad, kdy procházíme superglobální proměnnou $_GET (o superglobálních proměnných si povíme později), která je zároveň polem a uchovává veškeré informace o hodnotách předávaných v adresním řádku: echo "$_GET:
";
foreach($_GET as $index => $hodnota)
{
echo "$index => $hodnota
"; // postupně si vytiskneme veškeré indexy pole i s jejich hodnotami
}
Prázdný výraz
V PHP existuje i tzv. prázdný výraz. Jeho použití je mnohdy užitečné, např. tam, kde je očekáván nějaký příkaz, ale Vy tam, ať už z jakéhokoliv důvodu, žádný dát nechcete. Tak použijete právě tento výraz. Navíc je vždy vyhodnocován jako pravda, tudíž se jeho spektrum využití ještě více rozšiřuje. Pár příkladů využití:
; // nejobyčejnější - především v tělech cyklů, podmínek apod., kde nechcete použít blok, popř. alternativní zápis
if () // v podstatě také prázdný výraz; je vyhodnocen jako true, podmínka se provede
// v tomto případě je koncový výsledek shodný např. s těmito výrazy:
if (1)
// nebo
if (true) // apod.
// to samé platí u cyklů - např. for
for($i = 0; ; $i++)
// v tomto případě doporučuji použít někde v těle cyklu příkaz break;, který cyklus ukončí, např. pokud tam platí nějaká podmínka
Nekonečný cyklus
Nekonečný cyklus je věc, na kterou byste si měli dávat pozor, přestože není zase tak nebezpečný, jak se o něm říká, protože pokud se Vám ho podaří nějakou náhodou vytvořit, většinou tím webový server příliš neohrozíte. A to především z důvodu, že PHP má implicitně nastavenou maximální dobu provádění skriptu na 30 sekund. Přestože to je relativně krátká doba, dokáže takový cyklus vypisující dva znaky 'vyrobit' přes 10 MB dat!
A kód: for (;;)
echo "x ";
Závěr
Cykly máme úspěšně za sebou, přesto se jim příště budeme ještě trochu věnovat. Prozradím, že se to bude týkat příkazů break a continue.
Autor: mzima