Lekce 8: Cykly II - Foreach
- V 5. lekci jsem se zmínil o příkazu
foreach, který slouží též na procházení pole, ale je trochu odlišný.
- Nejenom, že má jinou syntaxi, ale také prochází vždy celé pole od 0 do konce (u příkazu
for jsme mohli nastavit od a do).
- Ale nebojte, lze cyklus ukončit stejně. Například přes
break.
- Další jeho odlišnost je v tom, že může procházet pole, kde nejsou indexy, ale slova.
Jak na foreach
- Výše jsem zmínil, že může procházet pole, kde nejsou indexy, ale slova. Uvedu tedy příklad pole, kde nejsou indexy, ale slova.
$zvirata = array(
"slon" => 10,
"ovce" => 20,
"pes" => 30,
"kocka" => 40,
"mys" => 50
);
- Zde mám pole o 5-ti zvířatech, kde index má slovní formu a přiřazenou hodnotu.
- Nyní potřebuju toto pole vypsat a jak jinak, než přes foreach.
foreach ($zvirata as $zv)
{
echo $zv."
";
}
- Takto vypadá základní syntaxe příkazu foreach.
- Jako první parametr je pole, poté slovíčko "jako"
as a na konci nová proměnná, která reprezentuje jednotlivý řádky v poli.
Jako proměnná
$i u příkazu
for.
- Tento způsob nám, ale moc nevyhovuje.
Vypisujeme pouze hodnoty těch zvířat. My potřebujem i jejich názvy. Takže to trochu upravíme.
foreach ($zvirata as $zvire => $hodnota)
{
echo $zvire." = $hodnota
";
}
- Tak a teď je to lepší. Proměnná
$zvire nám bere název indexu a v
$hodnota máme hodnotu.
- Všimněte si, že tvar foreach je dost podobný zápisu prvků do pole.
- Možná bude stát za ukázku to, jak použít foreach pro běžné pole.
$pole = array(1,2,3,4,5);
foreach ($pole as $i) echo $i."
"; // vypiseme pole (hodnoty)
foreach ($pole as $i => $val) echo $i."
"; // vypiseme pouze index bez hodnot
foreach ($pole as $i => $val) echo $i." = $val
"; // vypiseme indexy a hodnoty
- Jak vidíte, tak použití je celkem jasný a nelyší se od slovních indexů.
- Pokud budeme mít dvou-rozměrné pole, tak stejně jako u příkazu
for použijeme 2x foreach.
$pole = array(
array(1, 10, 100),
array(2, 20, 200),
array(3, 30, 300),
array(4, 40, 400),
array(5, 50, 500)
);
foreach ($pole as $arr) // projde pole poli
{
// prochazi jednotliva pole a vypisuje (za kazdou hodnotu da carku)
foreach ($arr as $i) echo $i.", ";
echo "
"; // odradkuje po vypsani kazdeho pole
}
- Možná se by se hodilo podotknout, že procházení pole přes foreach je
rychlejší než přes jiný cykly (hlavně v PHP).
Přídavek k cyklu for
- Tyto věco jsem nenapsal k cyklům for, takže je napíšu sem.
- Stejně jako u příkazu while je pro nekonečný cyklus true, tak něco podobného má i příkaz for.
while (true) { /* neco */ } // nekonecny cyklus pro while
for (;;) { /* neco */ } // nekonecny cyklus pro for
- V příkazu for můžeme též spojít více podmínek a dokonce spojit dva cykly for do jednoho.
// definice dvou poli
$a = array(1,2,3,4,5,6,7,8,9);
$b = array(10,20,30,40,50,60,70,80,90,100);
// dva cykly for v jednom (cyklus bude tak dlouho trvat, dokud se neprojde nejmensi pole)
for ($i = 0, $j = 0; $i < count($a) && $j < count($b); $i++, $j++)
{
echo "($a[$i] - $b[$j])
"; // vypise (1 - 10), (2 - 20)...
}
- Upřímně nevim k čemu by zrovna tento příklad byl dobrý :-D ...ale nic jiného mě v rychlosti nenapadlo jak ukázat,
že cyklus for muže mít více parametrů, které jsou oddělené čárkou.
- Ukážu ještě jeden příklad.
// prochazi vsechny cisla z ascii tabulky od A do Z a pocita pocet znaku
for ($znak = ord('A'), $pocet = 0; $znak <= ord('Z'); $znak++, ++$pocet)
{
echo chr($znak)." = ".$znak."
";
}
echo "Počet znaků je: ".$pocet;
- Celkem dobrý příklad, který ukazuje, že cyklus for má další proměnnou, která počítá počet cyklů. Mezitím proměnná pro číslo znaku má číslo jiné.
- Když už jsme u toho, tak tady je nový příkaz (funkce), která ze znaku vrátí dec. číslo z ascii tabulky a to
ord(). Je to vlastně opak příkazu
chr().
Dobrovolný domácí úkol
- Tady žádný úkoly dávat nebudu, protože vysvětlení je celkem obsáhlý a krom toho jsou to též cykly jako první části - Cykly I.