PHP udostępnia funkcję, która pozwala przeiterować po każdym elemencie tablicy i zastosować na nim jakąś dowolnie napisaną przez siebie funkcję. Bardzo przydatna opcja jeśli chcemy w tablicy wykonać pewne operacje inaczej niż wykożystując pętlę foreach, jest to też bardziej elegancki sposób jak sądzę.
tak to wygląda za pomocą pętli foreach:
//jakas tablica 3 elementowa
$arr = array('jeden'=>1, 'trzy'=>3, 'dwa'=>2);
echo "tablica przed array_walk ";
print_r($arr);
$sufix = 'nazwa';
foreach($arr as $key=>$val)
{
$val +=1;
$val = (string)$val . " " . $sufix;
$arr[$key]=$val;
}
echo "tablica po foreach: " ;
print_r($arr);
wynik:
tablica przed zmianami Array
(
[jeden] => 1
[trzy] => 3
[dwa] => 2
)
tablica po foreach: Array
(
[jeden] => 2 nazwa
[trzy] => 4 nazwa
[dwa] => 3 nazwa
)
a tak za pomocą array_walk
<?
//tekst preformatowany, żeby tablica ładniej się wyświetliła
echo "<pre>";
//jakas tablica 3 elementowa
$arr = array('jeden'=>1, 'trzy'=>3, 'dwa'=>2);
echo "tablica przed zmianami";
print_r($arr);
function show(&$val, $key, $sufix) //&$val referencja do elementów tablicy $arr
{
$val += 1; //inkrementujemy o 1 wartosc elementów tablicy
$val = (string)$val ." ". $sufix; //rzutujemy na stringa i dodajemy przyrostek do nazwy
}
array_walk($arr, 'show', 'nazwa');
echo "<br> tablica po array_walk: " ;
print_r($arr);
?>
[php]
i wynik:
[plain]
tablica przed zmianamiArray
(
[jeden] => 1
[trzy] => 3
[dwa] => 2
)
tablica po array_walk: Array
(
[jeden] => 2 nazwa
[trzy] => 4 nazwa
[dwa] => 3 nazwa
)
[/plain]
w przypadku array_walk musimy jednak pamiętać że jeżeli nie odniesiemy się do elementów tablicy przez referencję, jak to widać powyżej, to zmiany nie zostaną w niej zapisane, poniżej przykład:
[php]
<?
//tekst preformatowany, żeby tablica ładniej się wyświetliła
echo "<pre>";
//jakas tablica 3 elementowa
$arr = array('jeden'=>1, 'trzy'=>3, 'dwa'=>2);
echo "tablica przed zmianami";
print_r($arr);
function show($val, $key, $sufix)//brak referencji do tablicy $arr
{
$val += 1; //inkrementujemy o 1 wartosc elementów tablicy
$val = (string)$val ." ". $sufix; //rzutujemy na stringa i dodajemy przyrostek do nazwy
}
array_walk($arr, 'show', 'nazwa');
echo "<br> tablica po array_walk: " ;
print_r($arr);
?>
w rezultanie tablica $arr pozostaje niezmieniona:
tablica przed zmianamiArray
(
[jeden] => 1
[trzy] => 3
[dwa] => 2
)
tablica po array_walk: Array
(
[jeden] => 1
[trzy] => 3
[dwa] => 2
)