Forum und email
switch

switch

Příkaz switch je podobná sérii příkazů IF, testujících tentýž výraz. V mnoha případech můžete chtít porovnávat stejnou proměnnou (nebo výraz) s mnoha různými hodnotami a provádět různé kusy kódu v závislosti na tom, které hodnotě se rovná. To je přesně to, k čemu je switch.

Následující dva příklady představují dva odlišné způsoby, jak napsat totéž; jeden používá sérii podmínek if, zatímco druhý je založen na příkazu switch:

if ($i == 0) {
    print "i se rovná 0";
}
if ($i == 1) {
    print "i se rovná 1";
}
if ($i == 2) {
    print "i se rovná 2";
}

switch ($i) {
    case 0:
        print "i se rovná 0";
        break;
    case 1:
        print "i se rovná 1";
        break;
    case 2:
        print "i se rovná 2";
        break;
}

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 (resp. příkaz po příkazu). Na začátku není proveden žádný kód. 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í kódu 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). Například:

switch ($i) {
    case 0:
        print "i se rovná 0";
    case 1:
        print "i se rovná 1";
    case 2:
        print "i se rovná 2";
}

Zde, pokud se $i rovná 0, se budou provádět všechny příkazy "print"! Pokud se $i rovná 1, PHP provede poslední dva příkazy, a pouze rovná-li se $i číslu 2, obdržíte "očekávané" chování a zobrazí se pouze "i se rovná 2". Takže je důležité nezapomenout na příkaz break (kromě případu, kdy ho chcete vynechat záměrně k dosažení určitého cíle).

V příkazu switch se podmínka testuje pouze jednou a výsledek se porovnává s každou hodnotou v case. V případě elseif se podmínka pokaždé testuje znovu. Pokud je vaše podmínka komplikovanější než jednoduché porovnání a/nebo je uvnitř cyklu, switch může být rychlejší.

Seznam příkazů za case může být také prázdný, což jednoduše předá řízení následujícímu case.

switch ($i) {
    case 0:
    case 1:
    case 2:
        print "i je menší než 3, ale nezáporné";
        break;
    case 3:
        print "i je 3";
}

Speciální case je "default". Vyhovuje všem ostatním hodnotám, které nejsou pokryty některým z ostatních case a má být vždy jako poslední. Například:

switch ($i) {
    case 0:
        print "i se rovná 0";
        break;
    case 1:
        print "i se rovná 1";
        break;
    case 2:
        print "i se rovná 2";
        break;
    default:
        print "i se nerovná 0, 1 ani 2";
}

Výraz v case může být libovolný výraz, jehož hodnota je jednoduchého typu, tj. celé nebo reálné číslo nebo řetězec. Pole ani objekty nelze použít, ledaže by odkazovaly na jednoduchý typ.

Alternativní syntaxe pro příkazy switch je podporována. Pro víc informací viz Alternativní syntaxe řídicích struktur .

switch ($i):
    case 0:
        print "i se rovná 0";
        break;
    case 1:
        print "i se rovná 1";
        break;
    case 2:
        print "i se rovná 2";
        break;
    default:
        print "i se nerovná 0, 1 ani 2";
endswitch;