10. Cykly

Cykly jsou konstrukce, které umožňují vykonávat stejné nebo podobné příkazy vícekrát po sobě. Cykly se používají velmi často a nedá se bez nich skoro napsat žádný rozumný skript. Součástí cyklu je i podmínka, která vyhodnocuje, kdy má již provádění cyklu skončit. Někdy potřebujeme, aby se určité cykly opakovaly po určitý počet opakování, třeba desetkrát, Jindy můžeme chtít, aby se cyklus opakoval po určitý čas, další variantou může být např. požadavek, aby cyklus neustále vypisoval určená data z databáze, než se vypíšou všechny apod. Proto existují v PHP pro různé varianty cyklů různé konstrukce:

  • cyklus while
  • cyklus do while
  • cyklus for
  • konstrukce switch
  • cyklus foreach (viz kapitola Pole v PHP)

Cyklus while

Je to nejjednodušší varianta cyklu. Základní tvar je:

while (podmínka)
 příkaz_který_se_bude_cyklicky_opakovat;

Princip:

  1. Otestuje se podmínka. Pokud není pravdivá, cyklus while končí a PHP pokračuje za cyklem while
  2. Pokud je podmínka pravdivá, vykoná se příkaz a cyklus se opakuje.

Jinak řečeno, smyslem cyklu while je neustále dokola opakovat příkaz, dokud platí podmínka. Příkaz se však nemusí provést ani jednou. To v případě, že hned na začátku po testování je podmínka nepravdivá. Příklad cyklu while:

<?php
 $i = 1;
 // Proměnné $i je přiřazeno číslo 1
 while ($i <= 5)
 {
 echo $i,' ';
 // Vypiš číslo uložené v proměnné $i a pak vypiš mezeru, aby čísla nebyla nalepená hned na sobě.
  ++$i;
 // Inkrementace proměnné $i, tedy zvětšení čísla o jedničku.
 }
?>

Tento příklad vypisuje čísla od jedné do pěti.

Příkaz break v cyklech

Existuje možnost či potřeba přerušit provádění cyklu v určitém okamžiku. K tomuto účelu existuje příkaz break. Jakmile PHP narazí na tento příkaz, okamžitě cyklus předčasně ukončí:

<?php
 $i = 1;
 // Proměnné $i je přiřazeno číslo 1
 while ($i <= 5)
 {
 if ($i > 2)
 break;
 // Pokud bude proměnná $i větší než dvě, vykonej příkaz break
  echo $i,' ';
 // Vypiš číslo uložené v proměnné $i a pak vypiš mezeru, aby čísla nebyla nalepená hned na sobě.
  ++$i;
 // Inkrementace proměnné $i, tedy zvětšení čísla o jedničku.
 }
?>

Cyklus do while
Je velmi podobný cyklu while. Jediný rozdíl je v umístění podmínky, která se testuje.

do
 příkaz_který_se_bude_cyklicky_opakovat;
while (podmínka);

Princip je tedy jednoduchý:

  1. Vykoná se příkaz
  2. Otestuje se podmínka. Pokud je pravdivá, pokračuje cyklus znovu od začátku

Na rozdíl od cyklu while se cyklus do while vykoná vždy alespoň jednou.

Příklad:

<?php
 $i = 1;
 // Proměnné $i je přiřazeno číslo 1
  do
 {
 echo $i,' ';
 // Vypiš číslo uložené v proměnné $i a pak vypiš mezeru, aby čísla nebyla nalepená hned na sobě.
  ++$i;
 // Inkrementace proměnné $i, tedy zvětšení čísla o jedničku.
 }
 while ($i <= 2);
?>

Cyklus for
Cyklus for je nejsložitějším cyklem v PHP, přesto pro svou užitečnost patří k nejpoužívanějším cyklům vůbec. Používáme ho především tam, kde víme, kolikrát chceme cyklus opakovat. Jeho základní tvar vypadá následovně:

for (počáteční_příkaz; podmínka; příkaz_který_se_vykoná_po_každém_cyklu)
 příkaz_který_se_bude_cyklicky_opakovat;

Jinak také:

for(inicializace proměnné; podmínka; operace) {skript}

Cyklus probíhá následovně:

  1. Nejdříve se vykoná počáteční příkaz
  2. Otestuje se podmínka. Pokud je pravdivá, pokračuje se následujícím bodem 3. pokud není pravdivá, cyklus skončí a PHP pokračuje za cyklem for
  3. Vykoná se „příkaz, který se bude cyklicky opakovat“ a hned poté se vykoná „příkaz, který se vykoná po každém cyklu“. Pokračuje se znovu bodem 2.

Kód cyklu for (i když je nejsložitější) má velmi jednoduchý kód. Příklad:

<?php
 for ($i=1; $i<=5; ++$i)
 echo $i, ' ';
?>

Popis:

  1. Nejdříve se vykoná počáteční příkaz (inicializace proměnné). Je to první příkaz v závorce. V tomto případě to je přiřazení proměnné $i na číslo 1.
  2. Pak se otestuje podmínka, v tomto případě se testuje, zda je proměnná $i menší nebo rovna číslu 5. Pokud je podmínka pravdivá, pokračuje se vykonáním příkazu, který se bude cyklicky opakovat (skript), v tomto případě tedy vypsáním proměnné $i.
  3. Dále se pokračuje příkazem, který se vykoná po každém cyklu (operace), v tomto případě je to inkrementace – zvětšení hodnoty o jednu.
  4. Následuje opakování cyklu, tedy otestuje se podmínka atd… Jakmile je testovaná podmínka nepravdivá, okamžitě cyklus končí a PHP pokračuje až za cyklem for.
  5. Jak již bylo zmíněno, tento cyklus se především využívá v případě, že víte, kolikrát se má daná operace provádět. Např. zákazník v e-shopu může stáhnout tři soubory zdarma. Další už budou placené… apod.

Konstrukce switch
Konstrukce switch slouží k testování (porovnáváním) hodnoty proměnné se zadanými hodnotami. Příklad:

<?php
 $zeme = 'cz';
 // Textový řetězec (v tomto případě zkratka cz) je přiřazena do proměnné $zeme
 switch ($zeme) {
 case 'cz':
 echo 'Česká republika';
 case 'sk':
 echo 'Slovenská republika';
 case 'pl':
 echo 'Polsko';
 }
?>

Vysvětlení:

Textový řetězec (v tomto případě zkratka cz) je přiřazena do proměnné $zeme. Konstrukce switch začne porovnávat obsah proměnné $zeme s jednotlivými hodnotami uvedenými u větví case. V tomto případě je to postupně cz, sk a pl. Jakmile PHP narazí na shodnou hodnotu, vykoná příkaz v dané větvi case. V našem případě je to vždy vypsání daného textového řetězce. Protože v proměnné máme hodnotu ‘cz‘, ve výsledku se vypíše Česká republika.

Protože uvedený příklad funguje tak, že i po vyhledání shodné hodnoty nadále PHP pokračuje v porovnávání a hledání hodnot dalších větví case, musí se doplnit konstrukce switch o příkaz break. Příklad:

<?php
 $zeme = 'cz';
 // Textový řetězec (v tomto případě zkratka cz) je přiřazena do proměnné $zeme
 switch ($zeme) {
   case 'cz':
     echo 'Česká republika';
     break;
   case 'sk':
     echo 'Slovenská republika';
     break;
   case 'pl':
     echo 'Polsko';
     break;
   }
?>

Jakmile PHP v konstrukci switch narazí na break, další příkazy se již nevykonají a PHP se tak „nezdržuje“ s testováním dalších větví case a pokračuje až za konstrukcí switch.

Další variantou je, že PHP při testování nenalezne žádnou shodnou hodnotu ve větvích case. Pro tento případ se vkládá další větev s názvem default. Příklad:

<?php
 $zeme = 'cz';
 // Textový řetězec (v tomto případě zkratka cz) je přiřazena do proměnné $zeme
 switch ($zeme) {
 case 'cz':
 echo 'Česká republika';
 break;
 case 'sk':
 echo 'Slovenská republika';
 break;
 case 'pl':
 echo 'Polsko';
 break;
 default:
 echo 'Nejste z České republiky, ze Slovenska ani z Polska';
 }
?>

Ještě můžeme konstrukci switch „vylepšit“ o vykonání příkazu pro určitou skupinu. Příklad:

<?php
 $zeme = 'cz';
 // Textový řetězec (v tomto případě zkratka cz) je přiřazena do proměnné $zeme
 switch ($zeme) {
    case 'cz':
    case 'sk':
    case 'pl':
 echo 'Střední Evropa';
 break;
// Země patřící do Střední Evropy
    case 'uk':
    case 'fr':
 echo 'Západní Evropa';
 break;
// Země patřící do Západní Evropy
default:
 echo 'Nejste ze Střední ani Západní Evropy';
 break;
 }
?>