Break a continue. Tak to je téma dnešního článku.
Break a continue najdou uplatnění především v cyklech, ale nejen tam. Pojďme bez nějakých úvodů rovnou na to.
Continue
Začneme příkazem continue, protože je jeho použití vyhraněno pouze pro cykly. Využívá se tam, kde je nutno aktuální průchod cyklem ukončit, např. když už to není potřeba nebo to není ani žádoucí. PHP tedy poté, co narazí na continue skončí aktuální průchod cyklem a pokračuje novým. Lze ho využít ve všech druzích cyklů, tedy tam, kde se něco opakuje. echo "Čísla do sta, dělitelné sedmi: ";
Příklady by měly být více méně jasné, ale pro jistotu vysvětlím.
for ($i = 0, $bylo = false; $i < 100; $i++)
{
// vyfiltrujeme hodnoty nedělitelné sedmi
if ($i % 7) continue;
if ($bylo) echo ", ";
echo $i;
$bylo = true;
}
// to samé zvládneme i pomocí while
echo "
";
echo "Opět čísla do sta, dělitelné sedmi: ";
$i = 0; $bylo = false;
while ($i < 100) { $i++; ... }
// ve foreach to jde také
echo "Čísla do sta, dělitelné sedmi, ještě jednou, naposled: ";
// musíme si připravit pole
$cisla = Array(1,2,3,4,5,6,7,8,9,10,13,14,18,21,25,34,35,77,78,79,99,100);
$bylo = false;
foreach ($cisla as $index => $hodnota)
{
if ($hodnota % 7) continue;
if ($bylo) echo ", ";
echo $hodnota;
$bylo = true;
}
for ($i = 0, $bylo = false; $i < 100; $i++)
Inicializujeme proměnné $i (čítací proměnná) a $bylo, která nám uchovává informaci o tom, zda jsme již nalezli nějaké číslo dělitelné sedmi. Následuje podmínka, která nám zajistí, abychom na dělitelnost prověřovali pouze čísla do sta. A inkrementace čítací proměnné.
if ($i % 7) continue;
Pokud zbude po dělení čísla sedmi nějaký zbytek (tj. číslo 1-6), přeruší se aktuální průchod cyklem a pokračuje se po inkrementaci čítací proměnné a po ověření podmínky dalším průchodem.
if ($bylo) echo ", ";
Zde právě využijeme proměnnou $bylo. Pokud jsme totiž již nějaké číslo vypsali a chceme vypsat další, bylo by vhodné je oddělit čárkou vč. mezery.
echo $i;
Vytiskneme číslo dělitelné sedmi a nastavíme proměnnou $bylo na true.
$bylo = true;
$i = 0; $bylo = false;
Nastavíme proměnné na výchozí hodnoty, protože budeme provádět testování znovu.
while ($i < 100) { $i++; ... }
Místo teček si dosaďte kód z cyklu for. Před něj ale umístěte inkrementaci čítací proměnné, protože kdybyste ji dali na konec, vytvořili byste nekonečný cyklus: proměnná $i by totiž nabývala stále stejných hodnot a cyklus by byl vždy ukončen dříve, než by byla proměnná inkrementována.
$cisla = Array(1,2,3,4,5,6,7,8,9,10,13,14,18,21,25,34,35,77,78,79,99,100);
Vytvoříme si pole čísel, které budeme procházet, a nastavím si proměnnou $bylo na false. Další řádek snad ani vysvětlovat nemusím (viz. minulý díl).
$bylo = false;
foreach ($cisla as $index => $hodnota)
Break
Dost bylo continue, podíváme se na break. Break se dá přeložit jako brzda. Narozdíl od continue průběh cyklu nadobro ukončí, takže se už vícekrát neprovede, a PHP pokračuje v parsování dalšího kódu, co následuje za cyklem (popř. něčím jiným). Break má mírně širší sféru použitelnosti, a to od cyklů, až po podmínky. Tím samozřejmě nemyslím podmínku if, ale třeba rozbočovač switch, kde to je jeden z nejdůležitějších příkazů: // použití u switch, např. vypsání nadpisu dle stránky
Při demonstraci použití break u switch bylo použito příkladu, kdy se vypíše nadpis podle toho, na jaké stránce se právě nacházíme. V příkladu si dosazujeme, na které jsme stránce, sami - jak to udělat v praxi si ukážeme někdy později.
$stranka = "reference";
switch ($stranka)
{
case "ofirme": echo "Informace o firmě"; break;
case "cenik": echo "Ceník služeb"; break;
case "reference": echo "Naše reference"; break;
case "kontakt": echo "Kontakt na nás"; break;
case "uvod":
default: echo "Vítáme Vás na www prezentaci naší firmy!"; break;
}
// nyní pouze naznačím u while, for
while (1) // nekonečný cyklus
{
...
if (požadovaná_podmínka) break;
...
}
for (;;) // opět nekonečný cyklus
{
...
if (požadovaná_podmínka) break;
...
}
// u foreach samozřejmě lze break použít také
function Hledej ($kde, $co)
{
foreach ($kde as $index => $hodnota)
if ($co == $hodnota) break;
if ($kde[$index] == $co)
return $index;
else
return null;
}
case "uvod":
Zde necháváme parser propadnout přes hodnotu uvod do defaultních hodnot, protože nadpis je u obou stejný. Je tu také možnost tento řádek s case úplně vynechat a bude nám to fungovat stejně.
default: echo "Vítáme Vás na www prezentaci naší firmy!"; break;
Dále máme nekonkrétní příklady, kdy si vytvoříme nekonečný cyklus, který ale jednou skončí, až bude někde v cyklu splněna nějaká podmínka (naznačeno).
U příkladu pro foreach jsme si vytvořili funkci Hledej (vytváření funkcí a věci s tím spojené probereme později), která nám v předaném poli vyhledá index, pod kterým se skrývá hledaná hodnota. Funkce není dokonalá - má pár nedostatků, například neověřuje, zda je předaná hodnota skutečně pole - v opačném případě by skript skončil s chybou (je lepší si tyto situace ošetřit vlastními řešeními).
Opuštění více cyklů najednou
Oba příkazy (break a continue) je také možné doplnit parametrem určujícím, kolik vnořených cyklů mám být najednou opuštěno. Standardní hodnota je 1, tedy break či continue bez parametru opustí jeden cyklus. for ($i = 0; $i < 10; $i++)
Příklad má spíše demonstrační efekt, ale nepochybuji o tom, že dostatečný na to, abyste dokázali opustit cykly v praxi bez problémů.
{
for ($j = 10; $j > 0; $j--)
{
while (abs($i - $j))
{
if ($i < $j) break 2;
// opustí cyklus while a vnořený cyklus for
continue 3;
// pokračuje rovnou novým průchodem vnějšího cyklu
echo "Tento řádek nebude nikdy vytištěn";
}
echo "Ani tento řádek nebude nikdy vytištěn";
}
echo "Tento již ano.";
}
Závěr
Po dnešním dílu byste již měli dobře umět pracovat s cykly a nemělo by Vás nic zaskočit (pokud ano, napište do fóra a vyřešíme to nebo rovnou vydám dodatek k článku). Příště si blíže osvětlíme výstup a možnosti práci s ním.
Prosba
Ještě tu mám takovou prosbu na všechny čtenáře. Pokud máte zájem něco probrat, vyřešit, vysvětlit apod., klidně mi napište, pokusím se o tom něco napsat. Psát můžete na owebu(at)herniklasika.cz, děkuji všem za náměty.
Autor: mzima