PHP - 24. díl – konstrukce switch, cyklus while

Dnešní díl seriálu o PHP bude věnován dalším, zatím nevysvětleným řídícím strukturám switch, do, while, break a continue.

Konstrukce switch

Konstrukce switch slouží k porovnávání stejného výrazu s mnoha hodnotami. Přesně řečeno, je to něco, co byste zvládli napsat pomocí konstrukce if, ale switch může být daleko šikovnější. Například vypsání školní známky slovně můžeme napsat pomocí konstrukcí if takto:

<html>
<head>
<title>Příklad 1. z 24. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
$znamka = 3;

if ($znamka == 1)
  echo `jednička`;
if ($znamka == 2)
  echo `dvojka`;
if ($znamka == 3)
  echo `trojka`;
if ($znamka == 4)
  echo `čtyřka`;
if ($znamka == 5)
  echo `pětka`;
?>
</body>
</html>

V příkladu je nastavena proměnná $znamka na trojku, můžete si vyzkoušet nastavení na jinou hodnotu. Ale hlavní je, že právě porovnávání s mnoha hodnotami je doména konstrukce switch. Podívejme se, jak by stejný příklad vypadal pomocí konstrukce switch:

<html>
<head>
<title>Příklad 2. z 24. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
$znamka = 3;

switch ($znamka)
{
  case 1:
    echo `jednička`;
    break;
  case 2:
    echo `dvojka`;
    break;
  case 3:
    echo `trojka`;
    break;
  case 4:
    echo `čtyřka`;
    break;
  case 5:
    echo `pětka`;
    break;
}

?>
</body>
</html>

Tento výše uvedený příklad funguje naprosto stejně jako předchozí jenom je zapsán pomocí konstrukce switch. Konstrukce switch pracuje tak, že vyhodnotí výraz za slovem switch a pak hledá příslušný řádek s case s odpovídající hodnotou. Protože v našem případě je výraz $znamka za slovem switch roven hodnotě tři, začne vykonávání u řádku s case 3.

Je důležité pochopit, jak se příkaz switch provádí, aby se zabránilo chybám. Příkaz switch provádí řádek po řádku. Pouze tehdy, když se najde case s hodnotou odpovídající hodnotě výrazu u switch, začne PHP provádět následující příkazy. Vykonávání pokračuje, dokud se nedosáhne konce bloku switch nebo prvního příkazu break. Pokud nenapíšete na konec bloku po case příkaz break, bude PHP pokračovat v provádění dalších příkazů (po dalším case). Zkuste si příklad, jak by to vypadalo, když chybí příkazy break:

<html>
<head>
<title>Příklad 3. z 24. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
$znamka = 3;

switch ($znamka)
{
  case 1:
    echo `jednička`;
  case 2:
    echo `dvojka`;
  case 3:
    echo `trojka`;
  case 4:
    echo `čtyřka`;
  case 5:
    echo `pětka`;
}

?>
</body>
</html>

Pokud si tento příklad bez příkazů break zkusíte, zjistíte, že se provedou všechny příkazy za case 3, a to až do konce příkazu switch. To je proto, že žádný příkaz break nezabránil pokračování. Výsledkem bude vypsání nejen slova trojka, ale i slova čtyřka a pětka.

U příkazu switch existuje alternativní syntaxe. Náš příklad s vypsáním známky v alternativní syntaxi by vypadal takto:

<html>
<head>
<title>Příklad 4. z 24. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
$znamka = 3;

switch ($znamka):
  case 1:
    echo `jednička`;
    break;
  case 2:
    echo `dvojka`;
    break;
  case 3:
    echo `trojka`;
    break;
  case 4:
    echo `čtyřka`;
    break;
  case 5:
    echo `pětka`;
    break;
endswitch;

?>
</body>
</html>

Cyklus while

Cyklus while je nejjednodušším cyklem v PHP. Jeho tvar je:

while (podmínka)
  příkaz;

Cyklus while provádí příkaz stále dokola tak dlouho, dokud platí podmínka. Zde je příklad, který pomocí cyklu while vypíše čísla od jedné do deseti:

<html>
<head>
<title>Příklad 5. z 24. dílu</title>
</head>
<body>
<?php
  $i=1;
  while ($i <= 10)
  {
    echo $i,`<br>`;
    ++$i;
  }
?>
</body>
</html>

U cyklu while existuje alternativní syntaxe, která vypadá takto:

while (podmínka):
  seznam příkazů;
endwhile;

Předchozí příklad zapsaný pomocí alternativní syntaxe by vypadal takto:

<html>
<head>
<title>Příklad 6. z 24. dílu</title>
</head>
<body>
<?php
  $i=1;
  while ($i <= 10):
    echo $i,`<br>`;
    ++$i;
  endwhile;
?>
</body>
</html>

Cyklus do..while

Cyklus do..while je velmi podobný cyklu while s tím rozdílem, že podmínka se testuje až na konci každého provedeného cyklu, a nikoli na začátku, jako u cyklu while. Cyklus do..while má tento tvar:

do
  příkaz;
while (podmínka);

Protože se podmínka cyklu do..while testuje až na konci každého cyklu, musí se každý cyklus do..while provést alespoň jednou.

Zde je příklad, který zařídí vypsání čísel od jedné do deseti pomocí cyklu do..while:

<html>
<head>
<title>Příklad 7. z 24. dílu</title>
</head>
<body>
<?php
  $i=1;
  do
  {
    echo $i,`<br>`;
    ++$i;
  }
  while ($i <= 10);
?>
</body>
</html>

Příkaz break

S příkazem break jsme se už setkali u konstrukce switch. Příkaz break předčasně ukončuje provádění konstrukce switch, nebo jakéhokoliv cyklu, ať už cyklu while, do..while, for, nebo jiného. Například následující cyklus while vypíše díky příkazu break čísla jen od jedné do pěti:

<html>
<head>
<title>Příklad 8. z 24. dílu</title>
</head>
<body>
<?php
  $i=1;
  while (i <= 10)
  {
    echo $i, `<br>`;
    if (i >= 5)
      break;
    ++$i;
  }
?>
</body>
</html>

Ve výše uvedeném příkladu uvnitř cyklu while provedeme příkaz break, pokud se proměnná i stane větší, nebo rovnou pěti. To předčasně ukončí cyklus while už po vypsání čísla pět.

Příkaz break při použití uvnitř cyklu tedy ukončuje provádění dalších cyklů.

Příkaz continue

Příkaz continue se používá uvnitř cyklů. Dělá v podstatě velmi jednoduchou věc, a to tu, že se přeskočí zbytek aktuální cyklu a začne se cyklus nový. Vysvětlíme si to na příkladu, který vypíše pouze sudá čísla do deseti:

<html>
<head>
<title>Příklad 9. z 24. dílu</title>
</head>
<body>
<?php
  $i=1;
  while ($i <= 10)
  {
    ++$i;
    if (($i % 2) != 0)
      continue;
    echo $i, `<br>`;
  }
?>
</body>
</html>

Nejdříve musím vysvětlit, že výraz ($i % 2) znamená zbytek po dělení dvěma. Pokud tedy zbytek po dělení dvěma není roven nule, jedná se o liché číslo a tehdy se dostane ke slovu příkaz continue. Protože continue přeskočí zbytek cyklu, přeskočí tedy příkaz echo, který se pro lichá čísla neprovede. Tím se zobrazí pouze sudá čísla. Příkaz continue způsobí, že se znovu pokračuje následující řádkou za while a přeskočí se zbytek cyklu.

Diskuze (7) Další článek: BBC chce zaútočit na Google a Yahoo

Témata článku: , , , , , , , , , , , , , , , , ,