Cykly
Programování by bylo docela nepříjemnou prací, kdyby neexistovaly cykly. Cykly jsou určeny k opakovanému provádění bloku kódu v zadaném počtu nebo do splnění podmínky. V PHP jsou dva druhy cyklů: Cykly while (zatímco) testují podmínku před nebo po každé iteraci a znovu se provedou pouze v případě, že je splněna podmínka. Druhým typem cyklu je for (pro). V tomto případě je počet iterací dán obvykle před prvním provedením.
Cykly while
Cykly while jsou nejjednodušším typem cyklů v PHP. Základní formát příkazu while je tento:
while (podmínka) {
příkazy
}
Význam příkazu while je snadno pochopitelný. Říká PHP, že má provádět příkazy uvnitř složených závorek tak dlouho, dokud je výraz v závorce roven TRUE. Když program dojde k }, je podmínka znovu vyhodnocena, a pokud je vyhodnocena jako pravda, je kód uvnitř složených závorek proveden znovu. To se pořád opakuje až do chvíle, kdy podmínka splněna není. Podmínka je testována pouze na začátku každé iterace, takže pokud se změní někde uprostřed cyklu, kód bude proveden až do konce.
<?php
$i = 1;
while ($i <= 6) { // Pokud je $i menší nebo rovno 6:
echo '<h', $i, '>Nadpis v šesti velikostech</h', $i, '>', "\r\n";
++$i; // Zvětšíme $i o jedničku.
}
?>
Provádění cyklu však můžeme kdykoliv ukončit příkazem break. Následující kód simuluje házení kostkami. PHP má podle podmínky ve while 20 pokusů. Využijeme funkce rand(), která vrací náhodné číslo v zadaném rozmezí.
<?php
$Pokus = 1;
while ($Pokus <= 20) {
$a = rand(1,6);
$b = rand(1,6);
if ($a == 6 && $b == 6) { // Padly dvě šestky?
echo 'Bingo!', '<br>', "\r\n";
break; // Ukončí cyklus.
}
else {
echo $a, ' a ', $b, '<br>', "\r\n";
}
++$Pokus;
}
?>
Proměnným $a a $b tedy přiřadíme náhodnou hodnotu od 1 do 6. PHP se 20x pokusí "hodit kostkami dvě šestky". Pokud se tak stane, vypíše "Bingo!". Příkaz break ukončí cyklus po prvním "úspěšném hodu". Kdyby zde nebyl, cyklus by pokračoval v "házení kostkami" a mohlo by se vypsat "Bingo!" i vícekrát, pokud by vícekrát "padly dvě šestky".
Může nastat situace, kdy nebudeme chtít ukončit celý cyklus, ale pouze aktuální iteraci. To se dělá příkazem continue.
<?php
$Cislo = 1;
$Delitelnych_dvemi = 0;
$Delitelnych_ctyrmi = 0;
while ($Cislo <= 32) {
if ($Cislo % 2 == 0) {
echo 'Číslo <b>', $Cislo, '</b> je dělitelné dvěmi';
++$Delitelnych_dvemi;
}
else {
++$Cislo; // Vezmi další číslo.
continue; // Konec iterace.
}
if ($Cislo % 4 == 0) {
echo ' a čtyřmi.', '<br>', "\r\n";
++$Delitelnych_ctyrmi;
}
else {
echo '.', '<br>', "\r\n"; // Konec věty. :-)
++$Cislo; // Vezmi další číslo.
continue; // Konec iterace.
}
++$Cislo;
}
echo '<br>', "\r\n";
echo 'V řadě čísel <b>1</b> až <b>32</b> je ';
echo '<b>', $Delitelnych_dvemi, '</b> čísel dělitelných dvěmi a ';
echo '<b>', $Delitelnych_ctyrmi, '</b> čísel dělitelných čtyřmi.';
?>
Stejně jako u příkazu if se můžete někdy u příkazu while setkat s alternativní syntaxí, která se hodí zejména pro vkládání bloků HTML kódu.
<table>
<?php
$i = 1;
while ($i <= 5):
?>
<tr>
<td><?php echo $i; ?></td>
<td><input type="text" name="note_<?php echo $i; ?>" value=""></td>
</tr>
<?php
++$i;
endwhile;
?>
</table>
Cykly do...while
Cykly do...while jsou velmi podobné cyklům while kromě toho, že pravdivost výrazu se testuje na konci každé iterace namísto jejího začátku. Hlavní rozdíl oproti běžným cyklům while je ten, že první iterace cyklu do...while se provede vždy (pravdivostní výraz je testován až na konci iterace), což u cyklu while není zaručeno (pravdivostní výraz je testován na začátku iterace; pokud je vyhodnocen jako FALSE, provádění cyklu hned skončí).
do {
příkazy
}
while (podmínka);
<?php
$Pocet = 0;
$Celkem = 15;
echo '<select name="pocet_kusu">', "\r\n";
do {
echo '<option value="', $Pocet, '">', $Pocet, '</option>', "\r\n";
}
while (++$Pocet < $Celkem);
echo '</select>';
?>
U tohoto kódu se nula jako položka HTML elementu select objeví vždy, i když má proměnná $Pocet hodnotu 0.
Cykly for
Cykly for jsou nejsložitějšími cykly v PHP. Syntaxe cyklu for je následující:
for (výraz1; výraz2; výraz3) {
příkazy
}
Do závorek za klíčovým slovem for se zadávají tři výrazy oddělené středníky. První výraz je proveden pouze jednou, bezpodmínečně, na začátku cyklu. Na začátku každé iterace je vyhodnocen výraz 2. Pokud má hodnotu TRUE, cyklus pokračuje a zpracovává se kód uvnitř složených závorek. Je-li naopak vyhodnocen jako FALSE, provádění cyklu končí. Na konci každé iterace cyklu se provede výraz 3.
<?php
/* Vypše čísla od 1 do 10 */
for ($i = 1; $i <= 10; ++$i) {
echo $i, '<br>', "\r\n";
}
// Alternativní syntaxe:
for ($i = 1; $i <= 10; ++$i):
echo $i, '<br>', "\r\n";
endfor;
?>
Každý z výrazů může být prázdný. Prázdný výraz 2 znamená, že cyklus bude probíhat nekonečně dlouho (PHP, stejně jako C, implicitně předpokládá hodnotu TRUE). To nemusí být tak bez užitku, jak si můžete myslet. Často můžete totiž chtít ukončit cyklus pomocí podmíněného příkazu break, namísto použití pravdivostního výrazu (výraz 2).
Cyklus for používají zejména zkušenější programátoři. Ve skutečnosti cyklus for neumí nic, co by neuměl cyklus while, ale ve většině případů umožňuje lepší strukturovanost a kompaktnost.
<?php
// Vynechání výrazů v závorce a použití příkazu break:
$i = 1;
for ( ; ; ) {
if ($i > 10) {
break;
}
echo $i, '<br>', "\r\n";
++$i;
}
// I následující příklad vypíše čísla 1 až 10.
// Příkaz echo není možné použít (nemá návratovou hodnotu),
// místo něho použijeme print().
for ($i = 1; $i <= 10; print($i . '<br>' . "\r\n"), ++$i);
// Poslední výraz obsahuje dva příkazy oddělené čárkou.
?>