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:

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