Podręcznik PHP
Poprzedni | Rozdział 16. 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`