Tablice – wprowadzenie

Tablice są bez wątpienia największą siłą PHP. Dzięki dziesiątkom wbudowanych funkcji operacje na nich stają się bardzo proste a czas ich implementacji jest maksymalnie skrócony. Tablice są bardzo elastyczną strukturą danych. PHP dopuszcza tworzenie tablic numerycznych, asocjacyjnych, lub, co więcej, mieszanych – jedna tablica może zawierać zarówno klucze asocjacyjne jak i numeryczne. Na tym nie koniec ich elastyczności – tablice pozawalają na przechowywanie różnych typów danych, tzn. w jednej tablicy możesz umieścić jednocześnie np. inną tablicę i obiekt, bądź liczbę całkowitą – cokolwiek.
Podstawy
Każda tablica zawiera zbiór tzw. elementów. Tworzy się je na dwa sposoby. Pierwszy z nich to użycie konstrukcji językowej array() i przekazanie jej odpowiednich argumentów. Oto jak wygląda to na konkretnym przykładzie:
$a1 = array(1, 2, 3, 4);
$a2 = array(4 => 1, 2, 3, 4, 20 => 5, 6, 7);
$a3 = array('foo' => 'bar', 15, 'baz', 'b' => 'c');
$a4 = array('foo', 'bar' => 'baz', 'sally' => array(1, 2, 'b' => 'c'), 15);
W pierwszym przypadku tworzymy najprostszą tablicę przechowującą cztery liczby całkowite – ponieważ nie podaliśmy do jakich kluczy mają być przypisane elementy, PHP zajmie się tym za nas. Oto jak wygląda struktura tej tablicy:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

Należy tutaj zauważyć jedną, bardzo ważną rzecz – jeśli sami nie określimy inaczej, w PHP tablice indeksowane są zawsze od zera!. Istnieje jednak pewien wyjątek. Takim wyjątkiem jest tablica druga $2. Jej struktura wygląda następująco:

Array
(
    [4] => 1
    [5] => 2
    [6] => 3
    [7] => 4
    [20] => 5
    [21] => 6
    [22] => 7
)

Jak widać, pierwszy jej element ma indeks o wartości cztery – sami tak ustaliliśmy przy tworzeniu tablicy. Co jednak z resztą elementów? Mimo tego, że indeksy: 1, 2 i 3 są „wolne”, PHP przypisał kolejnym elementom wartości 5, 6 i 7, czyli od czwórki wzwyż. Idąc dalej, napotyka kolejną naszą własną definicję klucza – mianowicie elementowi o wartości pięć przypisujemy klucz dwadzieścia. Ostatnie dwa elementy dostają domyślne klucze: 21 i 22. Jak widać, można wysnuć taki wniosek, że przy przypisywaniu kolejnych domyślnych kluczy, PHP sprawdza wartość ostatniego klucza numerycznego, i na jego podstawie tworzy kolejny klucz, zwiększając go o jeden. Jeśli nie był podany żaden klucz, interpreter zaczyna numerację od zera i kolejnym elementom przypisuje wartości o jeden większe. Jeśli „naruszymy” ten porządek poprzez podanie własnego klucza, następnemu elementowi z nieprzypisanym kluczem zostanie domyślnie przypisany klucz o jeden większy niż ten, który podaliśmy ostatnio.

Trzecia tablica jest przykładem tablicy z pomieszanymi kluczami zarówno numerycznymi jak i asocjacyjnymi. Jej struktura wygląda następująco:

Array
(
    [foo] => bar
    [0] => 15
    [1] => baz
    [b] => c
)

Warto zauważyć także, że bez problemu możemy przechowywać w jednej tablicy różne typy wartości. Jeszcze dobitniej pokazuje to czwarta tablica:

Array
(
    [0] => foo
    [bar] => baz
    [sally] => Array
        (
            [0] => 1
            [1] => 2
            [b] => c
        )

    [1] => 15
)

Tablice można również tworzyć za pomocą operatora tablicowego. Oto przykład:
$a[] = 1;
$a[] = 2;
$a[10] = 3;
$a[] = 4;
W ten sposób utworzona tablica wygląda tak:

Array
(
    [0] => 1
    [1] => 2
    [10] => 3
    [11] => 4
)

Jak widać, także w tym przypadku indeksowanie idzie od zera. I tak samo jak w przypadku array() tak i tutaj po napotkaniu przez interpreter klucza podanego przez nas, następny element z nieprzypisanym kluczem, będzie miał indeks o wartości o jeden więcej niż ostatni podany przez nas klucz.
Należy zapamiętać sobie jeszcze jedną bardzo ważną rzecz odnośnie kluczy. PHP rozróżnia wielkość liter, jednak nie rozróżnia typów kluczy. Tzn., że np. klucz o nazwie ‘a’ to nie to samo, co klucz o nazwie ‘A’. Jednak przy nadawaniu kluczy, jeśli napiszemy 1, lub ’1′, dla interpretera będzie to oznaczało jeden i ten sam klucz. Nastąpi bowiem konwersja ze stringa do int-a (czyli z ’1′ do 1). Konwersja taka następuje jednak tylko gdy string przedstawia tradycyjną liczbę dziesiętną, tzn. w przypadku ’01′ nie nastąpi rzutowanie na 1.
Porównywanie tablic
Operacja porównania dwóch tablic zdarza się stosunkowo rzadko, jednak biorąc pod uwagę, że są to notatki do ZCE, warto wiedzieć, przynajmniej ogólnie, na czym ona polega. Do porównywania używamy dwóch operatorów:
- operatora porównania: ==
- operatora absolutnego porównania: ===
Spójrzmy na poniższy kod:
$a = array(1,2,3);
$b = array(1 => 2, 0 => 1, 2 => 3);
$c = array('a' => 1, 'b' => 2, 'c' => 3);
 
var_dump($a == $b); // true
var_dump($a == $c); // false
var_dump($a === $b); // false
Mamy tutaj trzy tablice, każda o tych samych wartościach. Operator == porównuje tablice w ten sposób, że sprawdza zgodność par: klucz-wartość – jeśli jedna i druga tablica ma takie same pary, wtedy operator == daje logiczną prawdę. Stąd też $a == $b daje true. Wyrażenie $a == $c daje false ponieważ pomimo tego, że wartości w jednej i drugiej tablicy są takie same, to jednak klucze nie zgadzają się.
Natomiast operator === podobnie jak operator == sprawdza zgodność par klucz-wartość, jednak poza tym, sprawdza on jeszcze, czy dane pary stoją na tym samym miejscu w tablicy. Dlatego $a === $b daje logiczny fałsz.
Łączenie tablic
PHP daje nam możliwość łączenia kilku tablic w jedną. Możemy to zrobić na dwa sposoby – albo za pomocą operatora dodawania („+”), albo za pomocą funkcji array_merge.

Łączenie za pomocą operatora dodawania
Przede wszystkim należy sobie zdać sprawę, że dodawanie tablic w PHP nie jest naprzemienne. Operator „+” dokleja do tablicy stojącej po jego lewej stronie elementy tablic stojących po prawej stronie. Trzeba również pamiętać, że przy dodawaniu pomijane są wartości przypisane do powtarzających się kluczy. Oto przykład:
$a = array('a' => 12, 'b' => 3, 'c' => 56);
$b = array('a1' => 44, 'b1' => 5);
$c = array('a1' => 23, 'b' => 45);
 
print_r($a + $b + $c);
Wynikiem powyższego dodawania będzie tablica:

Array
(
    [a] => 12
    [b] => 3
    [c] => 56
    [a1] => 44
    [b1] => 5
)


Łączenie za pomocą array_merge
array array_merge(array $tablica1 [,array $tablica2 [, array $ ...]])
Funkcja ta, podobnie jak operator dodawania łączy kilka tablic w jedną, działa ona jednak na nieco innej zasadzie. O ile „+” pomijał powtarzające się klucze, o tyle array_merge w przypadku kluczy asocjacyjnych nadpisuje stare wartości nowymi, natomiast w przypadku kluczy numerycznych, w przypadku duplikatów wartości „doklejane” są na końcu tablicy. Wszystko jak zwykle rozjaśni przykład:
$a = array('a' => 1, 'b' => 2, 'c' => 3, 4, 5);
$b = array('a' => 11, 'd' => 21, 'e' => 31, 41, 51);
$c = array('a' => 'a3', 100, 1000);
 
print_r(array_merge($a, $b, $c));
Wynikiem działania tego kodu będzie:

Array
(
    [a] => a3
    [b] => 2
    [c] => 3
    [0] => 4
    [1] => 5
    [d] => 21
    [e] => 31
    [2] => 41
    [3] => 51
    [4] => 100
    [5] => 1000
)

Jak widać tylko wartość przypisana do klucza ‘a’ została nadpisana przez wartość przypisaną do takiego samego klucza z tablicy $c (tutaj warto zwrócić uwagę, że w tablicy $b również znajduje się klucz ‘a’, jednak wartość do niego przypisana została zignorowana – po prostu w przypadku powtarzających się kluczy, w wynikowej tablicy zawsze znajdzie się wartość z tablicy podanej najpóźniej jako argument do array_merge). Spójrzmy jeszcze co się stało z wartościami przypisanymi do kluczy numerycznych – w wynikowej tablicy żadna z nich nie została pominięta. Pomimo, że w tablicy $a, $b i $c znajdują się wartości przypisane do tych samych kluczy, znajdują się one także w wynikowej tablicy z tym że zostały doklejone na końcu.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">