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:

authenticated user
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:

authenticated user
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;

 

Copyright © 2011-2018, Squelle Group, s.r.o., Drupal web, konzultace, školení a šablonování. • Obchodní podmínkyKontakty