98
PHP 5
4.5.1 Alternativní syntaxe Také pro cyklus for existuje alternativní zápis vyhýbající se použití složených závorek. Uvozovacím znakem bloku je opět dvojtečka, blok je ukončen příkazem endfor: <?php for (výraz1; výraz2; výraz3): příkaz1; příkaz2; příkaz3; endfor; ?>
4.6 Průchod polem pomocí foreach Cyklu for je podobný příkaz foreach, který slouží k iterativnímu procházení všech prvků daného pole. Již dříve jsme si řekli, že pro průchod poli používanými v PHP nelze rozumně použít žádný jiný druh cyklu. Jednoduchá syntaxe tohoto příkazu vypadá následovně: foreach ($pole as $hodnota) příkaz; V praxi to znamená, že proměnná pole je skutečnou proměnnou typu pole, jejíž všechny prvky chceme procházet, a hodnota zastupuje právě zpracovávaný prvek pole. Není podstatné, jak si proměnnou pojmenujeme. Příkaz foreach se postará o přiřazení správné hodnoty do této proměnné při každém průchodu. <?php $x = array(11, 13, foreach ($x as $y) // vypíše postupně // 11, 13, 12, 24, ?>
12, 24, 22, 8, 0, -12, 19); echo "$y, "; všechny prvky pole, tj: 22, 8, 0, -12, 19,
Tímto způsobem snadno projdeme celé pole, ale mnohdy pro správné zpracování potřebujeme zároveň znát příslušný index – to platí především u asociativních polí. V takovém případě je možné použít rozšířenou syntaxi, která v každém průchodu přiřadí nejen hodnotu do zadané proměnné, ale také její index do samostatné proměnné: foreach ($pole as $index => $hodnota) příkaz; Opět nezáleží na tom, jak si pojmenujeme naše „umělé“ proměnné, do kterých jsou přiřazeny hodnoty indexu i vlastní hodnoty pole. Například funkce, která vrací index největšího prvku zadaného pole bude vypadat takto: <?php function IndexNejvetsihoPrvku($a) { // není-li předaná proměnná typu pole, vrátí –1 a ukončí funkci if (!is_array($a)) return -1; $prvni = true; foreach($a as $index => $hodnota) if ($prvni) { $maxi = $index; $prvni = false; } elseif ($a[$maxi] < $hodnota)
4. Řízení běhu programu
Ukázka elektronické knihy, UID: KOS181201
PHP 5
99
$maxi = $index; return $maxi; } ?> Protože v této funkci vidíte opět něco nového, zrekapitulujeme si, jak vlastně funkce pracuje. Jako parametr je předána proměnná a. Protože PHP samo nenabízí způsob, jak zajistit předání proměnné správného typu, musíme to zajistit sami. Pomocí funkce is_array() zjistíme, zda bylo předáno pole či nikoli. Pokud ne, vrátí funkce hodnotu null a skončí. Pokud jsme dostali pole, je třeba jej projít pomocí foreach. Proměnná maxi nám slouží k uchování indexu nejvyšší hodnoty. Můžete si všimnout, že nikde neuchováváme vlastní nejvyšší hodnotu – pro její získání nám stačí index pole, takže další proměnná není třeba. Vlastní průchod lze popsat takto: 1. První prvek je automaticky nastaven jako nejvyšší hodnota a je uložen jeho index. 2. Jsou procházeny další prvky a je porovnávána jejich hodnota s dosud nejvyšší hodnotou. 3. Je-li nová hodnota vyšší, je do proměnné maxi uložen nový index nejvyšší hodnoty. 4. Po ukončení průchodu polem je v maxi uložen hledaný index a je vrácen jako funkční hodnota. Také pro cyklus foreach je možné použít alternativní syntaxi, přičemž ukončovacím řetězcem je tentokrát endforeach:
4.7 Cyklus while Dalším velmi často používaným cyklem je cyklus while. Cyklus while se používá v případech, kdy není znám počet průchodů jako v případě cyklu for, pouze podmínka pro ukončení. Syntaxe příkazu vypadá takto: while (podmínka) { příkazy; }
Řízení běhu programu
foreach ($pole as $index => $hodnota): příkaz; příkaz; ... endforeach;
nebo alternativně: while (podmínka): příkazy; endwhile; A průběh cyklu lze popsat takto: 1. Vyhodnotí se podmínka. Není-li splněna, je cyklus ukončen. 2. Jsou provedeny příkazy cyklu. 3. Pokračuje se od bodu 1. Jak vidíte, vlastní průběh je velmi jednoduchý, vše závisí pouze na testování podmínky. Ostatní řízení případné čítací proměnné apod. musíte zajistit sami. Cyklus while je cyklem
4.7 Cyklus while
Ukázka elektronické knihy, UID: KOS181201
100
PHP 5
odmítavým, což znamená, že v určitých případech nemusí být proveden ani jednou! Není-li již na počátku podmínka splněna, tělo cyklu vůbec nebude provedeno. Pokud potřebujete, aby bylo tělo cyklu alespoň jednou provedeno, použijte cyklus popsaný v následující podkapitole, cyklus do-while. Také je vidět, že libovolný cyklus for lze převést na cyklus while (ne vždy to jde naopak!) takto: inicializace; for (inicializace; podmínka; aktualizace) while (podmínka) { { příkaz1; příkaz1; příkaz2; příkaz2; ... ... příkazN; příkazN; aktualizace; } } Schéma tohoto převodu je jasné. Inicializační část je ve skutečnosti prováděna ještě před samotným cyklem a pouze jednou. Poté následuje vlastní cyklus se stejnou podmínkou, na jehož závěru (tj. po provedení všech příkazů těla cyklu) je proveden aktualizační příkaz (obvykle zvýšení čítací proměnné). Zároveň z tohoto schématu vidíme, že také cyklus for je cyklem odmítavým, takže se může stát, že tělo cyklu nebude provedeno ani jednou. Cyklus while se používá zvláště v případech, kdy nevíme přesně, kolik průchodů bude třeba, ale podmínku lze specifikovat snadno. Například čtení souboru – dokud nenajdeme konec souboru, přečtu řádek, zpracuji a znovu. Nebo zpracování výsledků z databáze. Nebo třeba jednoduchá funkce, která zjistí, kolik kladných celých čísel jedničkou počínaje je třeba vynásobit, abychom dostali číslo větší nebo rovno zadanému parametru: <?php function SoucinOd1($hranice) { $i = 0; $soucin = 1; while ($soucin < $hranice) $soucin *= ++$i; return $i; } ?> Základem funkce je cyklus while, ve kterém postupně dosud platný výsledek násobíme vzrůstajícími celými čísly počínaje číslem 1. Pokud tento součin přesáhne hranici zadanou jako parametr, cyklus skončí a je vrácena hodnota i, v níž je uložen počet násobených čísel. Díky tomu, že začínáme s hodnotou i rovnou 0 a zvyšujeme ji teprve uvnitř cyklu vždy před použitím, funguje funkce i pro případ, že zadáme jako hranici číslo menší než 1.
4.8 Cyklus do-while Cyklus do-while je používaný méně často, ale ve strukturovaném programování má své nezastupitelné místo. Jedná se o cyklus neodmítavý, neboli cyklus, jehož tělo je provedeno vždy alespoň jednou. Jeho syntaxe vypadá takto: do { příkaz1; příkaz2; } while (podmínka);
4. Řízení běhu programu
Ukázka elektronické knihy, UID: KOS181201