Příkaz foreach
Jste zde
Příkaz foreach slouží k procházení polí. Pro snazší pochopení se vrátíme k jednoduššímu příkladu s uživatelskými rolemi, tedy k tomuto kódu:
global $user; //dpm($user); $roles = $user->roles; //Vypíšeme strukturu pole $roles pomocí funkce dpm() dpm($roles);
Pomocí příkazu foreach nyní vypíšeme postupně všechny hodnoty pole:
global $user; //dpm($user); $roles = $user->roles; //Vypíšeme strukturu pole $roles pomocí funkce dpm() dpm($roles); //Projdeme pole pomocí příkazu foreach a vypíšeme jednotlivé hodnoty foreach ($roles as $item) { print $item . '<br />'; }
Výsledek:
administrator
Kdyby měl daný uživatel více rolí, vypíšou se postupně všechny. Pro lepší představu to nyní vyzkoušejte: v Drupalu nastavte novou roli editor, přiřaďte ji uživateli č. 1 a znovu spusťte výše uvedený kód.
Výsledek:
administrator
editor
Příkaz foreach se vykonává cyklicky (patří k tzv. příkazům cyklu), a to tak dlouho, dokud neprojde všechny prvky pole. Má následující syntaxi:
foreach ( VÝRAZ_POLE as $PRVEK ) { PŘÍKAZ }
$PRVEK
je proměnná, jejíž název si libovolně určíte. Reprezentuje vždy aktuální prvek pole - nabývá jiné hodnoty v každém cyklu příkazu.
Následující zápisy jsou tedy ekvivalentní:
Varianta 1
foreach ($roles as $item) { print $item . '<br />'; }
Varianta 2
foreach ($roles as $role) { print $role . '<br />'; }
Varianta3
foreach ($roles as $cokoliv) { print $cokoliv . '<br />'; }
Stejný výstup dá také alternativní zápis:
foreach ($roles as $item) : print $item . '<br />'; endforeach;
Nyní použijeme foreach na získání hodnot vícerozměrného pole. Vraťme se k uzlu, který obsahuje 2 obrázky. V následujícím příkladu zjistíme, jakou celkovou velikost mají obrázky nahrané v poli field_image
. Nejprve si musíme rozmyslet, jak „hluboko“ se s příkazem foreach potřebujeme v poli dostat, tak, abychom získávali data z jednotlivých obrázků. Struktura proměnné $images
, se kterou jsme prve pracovali, nebude vhodná, protože nám „stojí v cestě“ ještě jedno pole obsahující jazykové varianty. Proto se potřebujeme dostat o jednu úroveň dál:
//V následující funkci použijte NID vašeho uzlu s obrázky $node = node_load(2); //Proměnná $images_und bude obsahovat pole obrázků pro neutrální jazyk. $images_und = $node->field_image['und']; //Pro přehlednost opět vypíšeme strukturu proměnné $images_und, později je nutné zakomentovat nebo smazat dpm($images_und);
Na výstupu zkontrolujeme, že jsme obdrželi pole, kde jednotlivé prvky již představují jednotlivé obrázky (označené klíči 0
a 1
).
Nyní projdeme pole pomocí příkazu foreach a budeme postupně sčítat velikost obrázků (později si můžete ověřit, že to funguje stejně dobře i pro větší počet obrázků):
//V následující funkci použijte NID vašeho uzlu s obrázky $node = node_load(2); //Proměnná $images_und bude obsahovat pole obrázků pro neutrální jazyk. $images_und = $node->field_image['und']; //Pro přehlednost opět vypíšeme strukturu proměnné $images_und, později je nutné zakomentovat nebo smazat dpm($images_und); //Velikost obrázků budeme ukládat do proměnné $total_size $total_size = 0; foreach ($images_und as $item) { $total_size .= $item['filesize']; } print 'Celková velikost obrázků: ' . $total_size;