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ć 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 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"

 
;

 
}