Podręcznik PHP
Poprzedni | Rozdział 11. Struktury kontrolne | Następny

# `foreach`

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:

`$arr = array("jeden", "dwa", "trzy"); reset ($tabl); while (list(, $wartość) = each ($tabl)) { echo "Wartość: $wartość<br>\n"; } foreach ($tabl as $wartość) { echo "Wartość: $wartość<br>\n"; }`

Poniższe przykłady są również funkcjonalnie identyczne:

`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"; }`

Poprzedni | Spis treści | Następny
`for` | Początek rozdziału | `break`