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.

Kategoria: php

Skomentuj styczeń 10th, 2009

ZCE: Basics

Postanowiłem zdać w końcu , aby uzupełnić wiedzę zacząłem od książki Study Guide. Postanowiłem podzielić się z Wami moimi notatkami z tej książki podzielę je w/g rozdziałów, więc zacznę od działu “Basics”

W jaki sposób zdefiniować zmienna o nazwie składającej się z samych cyfr?

$a = '123';
$$a = .123;
echo ${'123'}; // 0.123

Przerwanie pętli na więcej niż jedną iteracje robimy z użyciem break i podania liczby iteracji do pominięcia, np:

for ($i=0; $i<10; $i++) {
   if ($i == 2)
      break 2;
}

A na koniec dwa podchwytliwe, jakie będą wyniki działania poniższego kodu na maszynie 32-bit?

1 << 32;
(int)((0.1 + 0.7) * 10);

Pierwsza linia kodu to przesunięcie o 32 bity liczbę typu integer, która na maszynie 32-bit ma długość 32 bity, czyli działanie wykracza poza zakres i zamiast wyniku dostajemy 0.
Druga linia to przykład, że nie można ufać typowi float, mimo iż spodziewamy się, że wynikiem będzie liczba 8, to niestety ale liczby float są przechowywane inaczej przez maszynę i wynik to 7.

Kategoria: php

Skomentuj styczeń 9th, 2009

Następny wpis Poprzedni wpis


Kategorie

Linki

Tag Cloud

RSS