Archive

Posts Tagged ‘iteracja po tablicy’

array_walk w php

October 31st, 2009 Marcin Wadowski Comments off

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
)