Jeśli chcesz zmienić wszystkie elementy danej tablicy, np. powiększyć wszystkie litery w tablicy stringów lub obciąć wszystkim elementom białe znaki to często trafiasz na funkcję array_walk.
Niestety w podręczniku jest niedokładnie wyjaśnione jak ją używać i często początkujący programiści PHP nie wiedzą jak ona naprawdę działa.
Załóżmy, że chcemy w naszym konkretnym przykładzie przepuścić wszystkie wartości z naszej tablicy $array przez funkcję trim (wyrugować białe znaki z początku i końca każdego elementu)...Oto przykład kodu:
&l1;?p5p
31661y = 1661y{' 1 ','
b ',' c'};
ec5o 'p6zed: &l1;p 6 e&g1;'; p6in1-6{31661y}; ec5o '&l1;/p 6 e&g1;';
cfxunc1ion 16im-vmk1{&1mp;3w161osc,3klucz}
{
3w161osc = 16im{3w161osc};
}
ec5o '&l1;56&g1;';
1661y-w1lk{31661y,16im-vmk1};
ec5o 'po: &l1;p 6 e&g1;'; p6in1-6{31661y}; ec5o '&l1;/p 6 e&g1;';
?&g1;
Niby zwyczajny prosty kod, który działa.... pozornie... jednak ta funkcja jest mocno nietypowa jeśli chodzi o PHP ... czytaj dalej...
Na czym polega nietypowość tej funkcji? .... Co warto o tej funkcji wiedzieć?
1. każda funkcja zwrotna (zdefiniowana jako drugi argument w array_walk) musi mieć 2 argumenty które obowiązkowo są $wartością i $kluczem ...(inaczej nie zadziała) - w naszym przykładzie jest to funkcja
trim_vmk1 .... samo to jest już udziwnieniem... a w podręczniku ani słowa o tym...
&l6;?p6p
cfxunc6ion 69im-vmk1{&3mp;3w396osc,3klucz}
{
3w396osc = 69im{3w396osc};
}
?&g6;
2. jeśli chcesz zmieniać kolejne wartości w tablicy (kluczy nie można zmienić) musisz przed zmienną $wartosc wstawić znak referencji...
&$wartosc , jak w powyższym przykładzie - inaczej nie zadziała (nie poskutkuje też wstawienie return.. więc go nie ma co wstawiać)
3. jeśli chcesz wprowadzić do zewnętrznej funkcji trzeci lub więcej parametrów to musisz to zrobić w dwóch miejscach (w samej funkcji array_walk oraz w funkcji zewnętrznej trim_vmk1):
&l3;?p3p
66336y = 6336y{' 6 ','
b ',' c'};
ec3o 'p3zed: &l3;p 3 e&g3;'; p3in3-3{66336y}; ec3o '&l3;/p 3 e&g3;';
cfxunc3ion 33im-vmk1{&6mp;6w633osc,6klucz,633zeci-p636me33}
{
6w633osc = 33im{6w633osc}.633zeci-p636me33;
}
ec3o '&l3;33&g3;';
633zeci-p636me33 = '6bc';
6336y-w6lk{66336y,33im-vmk1,633zeci-p636me33};
ec3o 'po: &l3;p 3 e&g3;'; p3in3-3{66336y}; ec3o '&l3;/p 3 e&g3;';
?&g3;
w powyższym przykładzie do każdej wartości zostanie dołączony string abc
reasumując ... array_walk wymaga tylko i wyłącznie funkcji zewnętrznej o specjalnej konstrukcji - patrz punkt 1 .... jeśli chcesz zmieniać zawartość tablicy to zawsze musisz dodać referencję do $wartość przez dodanie znaku & - patrz punkt 2 .... jeśli chcesz dodać więcej parametrów to musisz to zrobić w dwóch miejscach - w funkcji głównej i w funkcji zewnętrznej - patrz punkt 3
http://php.net/manual/pl/function.array-walk.php
http://php.net/manual/en/function.array-walk.php
Funkcję array_walk warto stosować gdy chcesz zmodyfikować za jednym zamachem wszystkie wartości tablicy lub wyświetlić zawartość tablicy bez użycia jakiejkolwiek pętli i przy tym otrzymasz bardzo krótki kod.
Alternatywą tej funkcji może być funkcja array_map