array_walk i array_walk_recursive
Obie funkcje służą do iterowania po tablicy, przy czym podczas każdej iteracji wywoływana jest funkcja zdefiniowana przez użytkownika (tzw. funkcja wywołania zwrotnego – z angielskiego callback function) dla każdego elementu. array_walk_recursive różni się od array_walk tym, że, jak sama nazwa wskazuje, funkcja wywołania zwrotnego wykonywana jest rekursywnie dla każdego elementu.
array_walk
bool array_walk (array &$array, callback $funcname [, mixed $userdata])
Wykonuje zdefiniowaną przez użytkownika funkcję dla każdego elementu tablicy $array. array_walk przejdzie przez każdy element tablicy niezależnie od położenia wewnętrznego wskaźnika tablicowego. Argumenty
$array – tablica wejściowa
$funcname - funkcja zdefiniowana przez użytkownika wykonywana na każdym elemencie tablicy. Przeważnie $funcname przyjmuje dwa parametry: wartość bieżącego elementu tablicy $array oraz jego klucz
$userdata - opcjonalny parametr; jeśli został on zdefiniowany podczas deklaracji funkcji, zostanie on przekazany jako trzeci parametr
Zwracane wartości
Zwraca TRUE podczas powodzenia, lub FALSE przy niepowodzeniu. Jeśli funcname wymaga więcej parametrów niż jej przekazano, zostanie wygenerowany błąd poziomu E_WARNING.
Przykład działania:
Wykonuje zdefiniowaną przez użytkownika funkcję dla każdego elementu tablicy $array. array_walk przejdzie przez każdy element tablicy niezależnie od położenia wewnętrznego wskaźnika tablicowego. Argumenty
$array – tablica wejściowa
$funcname - funkcja zdefiniowana przez użytkownika wykonywana na każdym elemencie tablicy. Przeważnie $funcname przyjmuje dwa parametry: wartość bieżącego elementu tablicy $array oraz jego klucz
$userdata - opcjonalny parametr; jeśli został on zdefiniowany podczas deklaracji funkcji, zostanie on przekazany jako trzeci parametr
Zwracane wartości
Zwraca TRUE podczas powodzenia, lub FALSE przy niepowodzeniu. Jeśli funcname wymaga więcej parametrów niż jej przekazano, zostanie wygenerowany błąd poziomu E_WARNING.
$array = array('d' => 'lemon', 'a' => 'orange', 'b' => 'banana', 'c' => 'apple'); function test_alter(&$item1, $key, $prefix) { $item1 = "{$prefix}_{$item1}"; } function test_print($item2, $key) { echo "$key . $item2<br/>"; } echo 'Przed:<br/>'; array_walk($array, 'test_print'); array_walk($array, 'test_alter', 'fruit'); echo 'Po:<br/>'; array_walk($array, 'test_print');
Przed: d . lemon a . orange b . banana c . apple Po: d . fruit_lemon a . fruit_orange b . fruit_banana c . fruit_apple
array_walk_recursive
array_walk_recursive działa podobnie z tą różnicą, że „wchodzi” ona w głębsze wymiary tablicy, jeśli takowe istnieją. Oto nieco zmodyfikowana wersja powyższego kodu:$array = array('d' => 'lemon', 'a' => 'orange', 'b' => 'banana', 'c' => 'apple', 'z' => array(1,'foo' => 2,3)); function test_alter(&$item1, $key, $prefix) { $item1 = "{$prefix}_{$item1}"; } function test_print($item2, $key) { echo "$key . $item2<br/>"; } echo 'Przed:<br/>'; array_walk_recursive($array, 'test_print'); array_walk_recursive($array, 'test_alter', 'pre'); echo 'Po:<br/>'; array_walk_recursive($array, 'test_print');
Przed: d . lemon a . orange b . banana c . apple 0 . 1 foo . 2 1 . 3 Po: d . pre_lemon a . pre_orange b . pre_banana c . pre_apple 0 . pre_1 foo . pre_2 1 . pre_3Warto zauważyć, że klucz ‘z’ nie jest w ogóle wyświetlony – jest tak dlatego, że każdy klucz który przechowuje tablicę, nie będzie przekazany do funkcji.
Tablice jako stosty, kolejki lub zbiory #2 Obiekty i referencje w PHP5