Vytvořte si AI tutoriál na míru! Vyzkoušejte generátor tutoriálů a ušetřete čas.

Rychlý průvodce příkazem switch-case v PHP

Sdílet na sociálních sítích:
Napsal: Jan Kubice
PHP

Naučte se ovládat tok programu v PHP pomocí elegantního příkazu switch-case.

Potřebujete porovnat hodnotu proměnné s několika možnými výsledky a na základě toho spustit určitý kód? V PHP máte k dispozici hned několik možností. Můžete použít sérii podmínek if-else, nebo využít elegantnější konstrukci switch-case.

V tomto tutoriálu se zaměříme na příkaz switch-case a ukážeme si, jak ho efektivně využít pro porovnávání proměnné s různými hodnotami.

switch-case vs. if-else: Přímé srovnání

Začněme jednoduchým příkladem, který demonstruje rozdíl mezi použitím if-else a switch-case pro řízení toku programu.

<?php

$zvířata = ['Slon', 'Lev', 'Jelen', 'Koza', 'Krokodýl', 'Zebra', 'Kůň'];

shuffle($zvířata);

$zvíře = $zvířata[0];

// Výstup: Lvi jsou v jihozápadní části zoo.
if ($zvíře == 'Slon') {
echo 'Sloni jsou v jižní části zoo.';
} elseif ($zvíře == 'Lev') {
echo 'Lvi jsou v jihozápadní části zoo.';
} elseif ($zvíře == 'Jelen') {
echo 'Jeleni jsou v severní části zoo.';
} elseif ($zvíře == 'Koza') {
echo 'Kozy jsou ve východní části zoo.';
} else {
echo 'Zeptejte se průvodce.';
}

// Výstup: Lvi jsou v jihozápadní části zoo.
switch ($zvíře) {
case 'Slon':
echo 'Sloni jsou v jižní části zoo.';
break;
case 'Lev':
echo 'Lvi jsou v jihozápadní části zoo.';
break;
case 'Jelen':
echo 'Jeleni jsou v severní části zoo.';
break;
case 'Koza':
echo 'Kozy jsou ve východní části zoo.';
break;
default:
echo 'Zeptejte se průvodce.';
}

?>


Zkuste kód spustit několikrát a pozorujte výstup. Všimněte si:

  1. Každý blok case je analogický bloku if nebo elseif.
  2. Výstup sekce if-else je shodný s výstupem sekce switch-case.
  3. Nezapomeňte na příkaz break, který ukončí vykonávání kódu v daném bloku case.

Kdybyste break v bloku case zapomněli a proměnná $zvíře by obsahovala hodnotu 'Lev', kód by vypsal umístění lvů, jelenů i koz a nakonec i výchozí zprávu o průvodci.

Příkaz default slouží jako "záchytná síť" pro všechny ostatní hodnoty proměnné $zvíře. Je to obdoba bloku else v konstrukci if-else. Pamatujte, že v kódu nemůžete použít více příkazů default.

Kontrola více podmínek najednou

Co dělat, pokud se v jedné sekci zoo nachází více zvířat? V případě if-else je můžeme zahrnout do jedné podmínky pomocí operátoru || (logický OR).

$zvíře = 'Zebra';

// Výstup: Zebry jsou v západní části zoo.
if ($zvíře == 'Slon' || $zvíře == 'Lev' || $zvíře == 'Koza') {
echo $zvíře . ' jsou v jižní části zoo.';
} elseif ($zvíře == 'Zebra') {
echo 'Zebry jsou v západní části zoo.';
} elseif ($zvíře == 'Jelen') {
echo 'Jeleni jsou ve východní části zoo.';
} else {
echo 'Zeptejte se průvodce.';
}


Výše uvedený kód správně informuje, že zebry jsou v západní části zoo. První blok if přeskočí, protože se vykoná pouze tehdy, pokud je $zvíře slon, lev nebo koza.

Jak přepsat tento kód pomocí switch-case? Možná byste to zkusili takto:

// Výstup: Zebry jsou ve východní části zoo.
switch ($zvíře) {
case 'Slon' || 'Lev' || 'Koza':
echo $zvíře . ' jsou ve východní části zoo.';
break;
case 'Zebra':
echo 'Zebry jsou v západní části zoo.';
break;
case 'Jelen':
echo 'Jeleni jsou v severní části zoo.';
break;
default:
echo 'Zeptejte se průvodce.';
}


Pozor! Tento kód tvrdí, že zebry jsou ve východní části zoo. Co se stalo?

Hodnota v příkazu switch se porovnává s hodnotami v blocích case pomocí volného porovnání. Výraz 'Slon' || 'Lev' || 'Koza' se vyhodnotí jako true. A protože volné porovnání s $zvíře (které obsahuje neprázdný řetězec, tedy pravdivostní hodnotu) také vrací true, vykoná se kód prvního bloku case a my dostaneme nesprávné umístění zeber.

Správný způsob, jak v příkazu switch ošetřit více hodnot, které mají vést ke stejnému kódu, je zapsat je na samostatné řádky:

// Výstup: Zebry jsou v západní části zoo.
switch ($zvíře) {
case 'Slon':
case 'Lev':
case 'Koza':
echo $zvíře . ' jsou ve východní části zoo.';
break;
case 'Zebra':
echo 'Zebry jsou v západní části zoo.';
break;
case 'Jelen':
echo 'Jeleni jsou v severní části zoo.';
break;
default:
echo 'Zeptejte se průvodce.';
}


Nyní získáme správnou polohu zeber a žádný návštěvník se v zoo neztratí.

Opakované vyhodnocování a výkon

Důležité je si uvědomit, že podmínka v příkazu switch se vyhodnocuje pouze jednou. Naproti tomu v konstrukci if-else se vyhodnocuje opakovaně, pro každý blok if zvlášť.

function nejlidnatější_město($země) {
return 'New York';
}

// Výstup: To není vůbec překvapivé.
switch (nejlidnatější_město('Spojené státy')) {
case 'New York':
echo 'To není vůbec překvapivé.';
break;
case 'Oakland':
echo 'To se nezdá správné.';
break;
}


V tomto příkladu voláme funkci nejlidnatější_město(), která vrací název města. V tomto případě vrací 'New York', ale mohla by být mnohem složitější a získávat data z webové služby. Použití if-else by v tomto případě vedlo k vícenásobnému volání funkce nejlidnatější_město().

Samozřejmě bychom se tomu mohli vyhnout uložením výsledku volání do proměnné, ale switch nám umožňuje vyhnout se proměnným úplně.




Související návody

Komentáře

Zatím žádné komentáře. Buďte první, kdo napíše svůj názor!