PHP 4 zawiera, czego brak w PHP 3, konstrukcjΩ foreach, podobn▒ do jej odpowiednik≤w z Perla i innych jΩzyk≤w. PΩtla ta umo┐liwia │atw▒ iteracjΩ wewn▒trz tablic. foreach dzia│a tylko na tablicach i ka┐da pr≤ba u┐ycia tej pΩtli na innym typie lub na niezainicjowanej zmiennej bΩdzie skwitowana komunikatem o b│Ωdzie. Istniej▒ dwie sk│adnie tej konstrukcji, przy czym druga jest mniej wa┐nym, lecz u┐ytecznym rozszerzeniem pierwszej:
foreach(wyra┐enie_tablicowe as $warto╢µ) wyra┐enie foreach(wyra┐enie_tablicowe as $klucz => $warto╢µ) wyra┐enie |
Pierwsza odmiana iteruje wewn▒trz tablicy podanej w wyra┐enie_tablicowe. Przy ka┐dej iteracji, warto╢µ aktualnego elementu tablicy jest przypisywana do zmiennej $warto╢µ, a wewnΩtrzny wska╝nik tablicy jest przesuwany o jeden (wiΩc w nastΩpnej iteracji przypisany zostanie kolejny element tablicy).
Druga odmiana dzia│a tak samo jak pierwsza, przy czym klucz aktualnego elementu tablicy zostanie przypisany do zmiennej $klucz w ka┐dej iteracji.
Notatka: Kiedy rozpoczyna siΩ wykonywanie pΩtli foreach, wewnΩtrzny wska╝nik tablicy jest automatycznie resetowany, co ustawia go na pierwszym elemencie tablicy. Oznacza to, ┐e nie trzeba wywo│ywaµ komendy reset() przed rozpoczΩciem pΩtli foreach.
Notatka: ProszΩ tak┐e pamiΩtaµ, ┐e konstrukcja foreach operuje na kopii tablicy, a nie na oryginale, wiΩc po│o┐enie kursora tablicy nie jest modyfikowane jak w konstrukcji each(), a zmiany dokonane na pobranym elemencie tablicy nie oddzia│uj▒ na oryginaln▒ tablicΩ. Jednak┐e wewnΩtrzny kursor oryginalnej tablicy jest przesuwany w trakcie trawersowania tablicy. Zak│adaj▒c, ┐e pΩtla foreach bΩdzie dzia│aµ a┐ do przetworzenia ca│ej tablicy, kursor tablicy bΩdzie siΩ znajdowa│ na ko±cu tablicy.
Notatka: foreach nie pozwala na ukrycie komunikat≤w o b│Ωdach za pomoc▒ '@'.
Mo┐na zauwa┐yµ, ┐e poni┐sze przyk│ady s▒ funkcjonalnie identyczne:
reset ($tabl); while (list(, $warto╢µ) = each ($tabl)) { echo "Warto╢µ: $warto╢µ<br>\n"; } foreach ($tabl as $warto╢µ) { echo "Warto╢µ: $warto╢µ<br>\n"; } |
reset ($tabl); while (list($klucz, $warto╢µ) = each ($tabl)) { echo "Klucz: $klucz; Warto╢µ: $warto╢µ<br>\n"; } foreach ($tabl as $klucz => $warto╢µ) { echo "Klucz: $klucz; Warto╢µ: $warto╢µ<br>\n"; } |
WiΩcej przyk│ad≤w demonstruj▒cych u┐ycie tej pΩtli:
/* przyk│ad 1 foreach: tylko warto╢µ */ $a = array (1, 2, 3, 17); foreach ($a as $v) { print "Aktualna warto╢µ \$a: $v.\n"; } /* przyk│ad 2 foreach: warto╢µ (z kluczem generowanym dla potrzeb ilustracji)*/ $a = array (1, 2, 3, 17); $i = 0; /* tylko dla potrzeb ilustracyjnych */ foreach($a as $v) { print "\$a[$i] => $v.\n"; $i++; } /* przyk│ad 3 foreach: klucz i warto╢µ */ $a = array ( "jeden" => 1, "dwa" => 2, "trzy" => 3, "siedemna╢cie" => 17 ); foreach($a as $k => $v) { print "\$a[$k] => $v.\n"; } /* przyk│ad 4 foreach: tablice wielowymiarowe */ $a[0][0] = "a"; $a[0][1] = "b"; $a[1][0] = "y"; $a[1][1] = "z"; foreach($a as $v1) { foreach ($v1 as $v2) { print "$v2\n"; } } /* przyk│ad 5 foreach: tablice dynamiczne */ foreach(array(1, 2, 3, 4, 5) as $v) { print "$v\n"; } |