Wpisy z styczeń 10th, 2009

ZCE: Arrays

W kolejnej części notatek z Study Guide przedstawię notatki z działu “Arrays”. to szerokie zagadnienie w PHP, a umiejętne korzystanie z nich daje nam wielkie możliwości. Na początek zrobimy dodawanie dwóch tablic z użyciem operatora + i funkcji array_merge:

$a = array (1, 2, 'a' => 3, 'b' => 4);
$b = array (1, 3, 'b' => 3);
$a + $b; // Array ( [0] => 1 [1] => 2 [a] => 3 [b] => 4 ) 
$b + $a; // Array ( [0] => 1 [1] => 3 [b] => 3 [a] => 3 ) 
array_merge($a, $b); // Array ( [0] => 1 [1] => 2 [a] => 3 [b] => 3 [2] => 1 [3] => 3 ) 
array_merge($b, $a); // Array ( [0] => 1 [1] => 3 [b] => 4 [2] => 1 [3] => 2 [a] => 3 )

Jak widać dodawanie tablic nie jest przemienne. Operator + sprawdza dodawane po kluczach (również numerycznych), do elementów pierwszej tablicy dodaje wszystkie elementy drugiej tablicy, które mają inne klucze. Dla tych samych kluczy zostają wartości z pierwszej tablicy.
Funkcja array_merge ignoruje klucze numeryczne, dodając wszystkie elementy o kluczach numerycznych z obu tablic. Dla pozostałych kluczy, jeśli klucze są takie same, ustawia wartości z drugiej tablicy.

Teraz coś podchwytliwego, konstrukcja foreach z użyciem referencji, bywa przydatne, ale też niebezpieczne.

$a = array ('zero', 'one', 'two');
foreach ($a as &$value) {}
foreach ($a as $value) {}

Wydaje się, że obie iteracje nic nie robią i że nasza tablica nie uległa zmianie, jednak kiedy wyświetlimy zawartość tablicy zobaczymy:

Array
(
    [0] => zero
    [1] => one
    [2] => one
)

Jak to możliwe? Po zakończeniu pierwszej pętli zmienna $value jest referencją do elementu $a[2]. Druga pętla z każdą iteracją zmienia wartość tego elementu, tak więc najpierw wpisuje do $a[2] wartość ‘zero’ z $a[0], następnie pobiera wartość z $a[1], więc teraz $a[2] zawiera ‘one’. W ostatniej pętli do $a[2] podstawiana jest wartość z $a[2], gdzie mamy ‘one’.

Nie będę przepisywał wszystkich funkcji do działań na tablicach bo jest ich za dużo, zresztą możecie je znaleźć ładnie opisane w dokumentacji. Opiszę jeszcze tylko funkcje array_walk i array_walk_recursive, które bywają bardzo przydatne, a mogą być Wam nieznane. Obie służą do wykonywania działań na elementach tablicy z użyciem zdefiniowanej wcześniej funkcji, przy czym array_walk_recursive działa rekurencyjnie, więc wykonuje działania również w tablicach zagnieżdżonych. Przykład:

function changeVal (&$value, &$key)
{
   $value = $value * 10;
}
 
$a = array(1, 3, 5);
$b = array(1, 2, 3, array(4, 5, 6));
array_walk($a, 'changeVal'); // Array ( [0] => 10 [1] => 30 [2] => 50 ) 
array_walk_recursive($b, 'changeVal'); // Array ( [0] => 10 [1] => 20 [2] => 30 [3] => Array ( [0] => 40 [1] => 50 [2] => 60 ) )

Użycie funkcji array_walk na tablicy wielowymiarowej zaowocuje fatal errorem.

Skomentuj styczeń 10th, 2009


Kalendarz

styczeń 2009
P W Ś C P S N
« grudnia   lipca »
 1234
567891011
12131415161718
19202122232425
262728293031  

Starsze wpisy

Kategorie