ZCE: Arrays
W kolejnej części notatek z Zend PHP 5 Certification Study Guide przedstawię notatki z działu “Arrays”. Tablice 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 tablice 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