Podręcznik PHP
Poprzedni | Rozdział 6. Typy danych | Następny

# Tablice (array)

Tablica w PHP jest obecnie uporządkowaną mapą. Mapa jest typem, który przyporządkowuje wartości do kluczy. Typ ten jest optymalizowany na wiele sposobów, więc można go używać jako typową tablicę, albo listę (wektorową), tablicę asocjacyjną (która jest jedną z implementacji mapy), słownik, kolekcję, stos, kolejkę, i temu podobne. Ponieważ wartością tablicy może być inna tablica PHP, można także łatwo symulować drzewa.

Wyjasnienie wspomnianych struktur wykracza poza problematykę tego podręcznika, aczkolwiek poniżej uwzględniono conajmniej jeden przykład na każdą z nich. Głębiej zainteresowanych czytelników odsyłamy do odpowiedniej literatury informatycznej.

## Składnia

### Tworzenie za pomocą array()

Tablicę można utworzyć za pomocą konstrukcji językowej array(). Argumentem tej konstrukcji są rozdzielone przecinkiem pary ``klucz` => `wartość``.

`klucz` może być albo nieujemną liczbą całkowitą, albo łańcuchem znaków. Jeśli klucz jest standardową reprezentacją nieujemnej liczby całkowitej, zostanie zinterpretowany tak, jak jest (tzn. `'8'` będzie zinterpretowane jako `8`, podczas gdy `'08'` będzie zinterpretowane jako `'08'`).

Wartością może być cokolwiek.

Jeśli pominiesz klucz, to jako klucz zostanie użyty najwyższy indeks całkowity + 1. Jeśli nie ma w ogóle indeksu całkowitego, to klucz będzie miał wartość `0` (zero). Jeśli użyjesz klucza, do którego już wcześniej została przypisana wartość, wartość ta zostanie nadpisana.

    array( [klucz =>]
    wartość
         , ...
         )
    // klucz jest albo łańcuchem znaków, albo nieujemną
                                        liczbą całkowitą
    // wartość może być dowolna

### Tworzenie i edytowanie składnią nawiasów kwadratowych

Można zmieniać istniejącą tablicę jawnie ustawiając wartości.

Robi się to przez przypisanie wartości do tablicy z podaniem klucza w nawiasach kwadratowych. Można także pominąć klucz i użyć pustej pary nawiasów ("`[]`").

    $arr[klucz] = wartość;
    $arr[] = wartość;
    // klucz jest albo łańcuchem znaków, albo nieujemną
                                        liczbą całkowitą
    // wartość może być dowolna

Jeśli tablica `$arr` nie istnieje, zostanie stworzona. Jest to więc metoda na tworzenie tablic. Aby zmienić wartość konkretnego klucza, po prostu przypisz nową wartość do niego. Aby usunąć parę klucz/wartość, trzeba użyć funkcji unset().

## Przydatne funkcje

Jest wiele przydatnych funkcji obsługi tablic, o czym więcej w rozdziale Tablice.

> Notatka: Funkcja unset() pozwala kasować komórki tablicy. W takiej sytuacji jednak tablica NIE zostanie zreindeksowana.

> `$a = array( 1 => 'jeden', 2 => 'dwa', 3 => 'trzy' ); unset( $a[2] ); /* to tak, jakby utworzyć tablicę: $a = array( 1 => 'jeden', 3 => 'trzy'); ale NIE: $a = array( 1 => 'jeden', 2 => 'trzy'); */`

Struktura kontrolna foreach została stworzona specjalnie dla potrzeb tablic. Dzięki niej można łatwo trawersować tablicę.

## Co wolno, a czego nie w tablicach?

### Dlaczego zapis `$foo[bar]` jest niepoprawny?

W starych skryptach można spotkać taką składnię:

`$foo[bar] = 'coś'; echo $foo[bar]; // itd.`

Ten zapis jest niepoprawny, ale działa. Dlaczego zatem jest niepoprawny? Powód jest to, co opisano w rozdziale składnia, że pomiędzy nawiasami kwadratowymi ('`[`' i '`]`') musi znajdować się wyrażenie. Oznacza to, że można używać czegoś takiego:

`echo $arr[ foo(true) ];`

Jest to przykład użycia wartości zwracanej przez funkcję jako indeksu tablicy. PHP zna też stałe, więc można spotkać zastosowanie `E_*`.

`$opis_błędu[E_ERROR] = "Wystąpił poważny błąd"; $opis_błędu[E_WARNING] = "PHP wysłało ostrzeżenie"; $opis_błędu[E_NOTICE] = "To jest tylko nieformalna uwaga";`

Proszę pamiętać, że `E_ERROR` jest także ważnym identyfikatorem, tak jak `bar` w pierwszym przykładzie. Ale ostatni przykład znaczy to samo co:

`$opis_błędu[1] = "Wystąpił poważny błąd"; $opis_błędu[2] = "PHP wysłało ostrzeżenie"; $opis_błędu[8] = "To jest tylko nieformalna uwaga";`

ponieważ `E_ERROR` znaczy to samo co `1`, itd.

W takiem razie, jak to możliwe, że `$foo[bar]` działa? To działa, ponieważ `bar`, zgodnie z jego zapisem powinien być stałą. Jednakże w tym przypadku nie instnieje stała o nazwie `bar`. PHP teraz zakłada, że masz na myśli `bar` literalnie, czyli jako łańucuch `"bar"`, tylko że zapomniałeś napisać cudzysłowów.

#### Więc dlaczego tak jest źle?

Kiedyś w przyszłości grupa PHP może chcieć dodać jeszcze jedną stałą lub słowo kluczowe i wtedy będziesz miał kłopot. Dla przykładu, obecnie już nie można używać słów `empty` i `default`, gdyż są to specjalne słowa kluczowe.

Poza tym, jeśli dotąd argumenty nie przekonują cię: ta składnia jest po prostu odrzucona i kiedyś może przestać działać.

> Notatka: Po przełączeniu error_reporting na `E_ALL`, zobaczysz, że PHP generuje ostrzeżenie, kiedy tylko powyższa składnia zostanie użyta. Tak samo generowane będą ostrzeżenia odnośnie innych odrzuconych "udogodnień". (umieść w swoim skrypcie linię `error_reporting(E_ALL);`)

> Notatka: Składnia ta jest dozwolona wewnątrz łańcucha znaków w podwójnych cudzysłowach. Więcej szczegółów na ten temat w rozdziale parsowanie zmiennych.

## Przykłady

Typ tablicowy w PHP jest bardzo różnorodny, co prezentują poniższe przykłady.

`// to: $a = array( 'kolor' => 'czerowny' , 'smak' => 'słodki' , 'kształt' => 'okrągły' , 'nazwa' => 'jabłko' , 4 // kluczem będzie 0 ); // znaczy dokładnie to samo, co to: $a['kolor'] = 'czerwony'; $a['smak'] = 'słodki'; $a['kształt'] = 'okrągły'; $a['nazwa'] = 'jabłko'; $a[] = 4; // kluczem będzie 0 $b[] = 'a'; $b[] = 'b'; $b[] = 'c'; // znaczy to samo co: array( 0 => 'a' , 1 => 'b' , 2 => 'c' ), // albo prościej: array('a', 'b', 'c')`

Przykład 6-4. Użycie array()
`// tablica jako mapa właściwości $mapa = array( 'version' => 4 , 'OS' => 'Linux' , 'lang' => 'polski' , 'short_tags' => true ); // tylko klucze liczbowe $array = array( 7 , 8 , 0 , 156 , -10 ); // znaczy to samo co array( 0 => 7, 1 => 8, ...) $zmiany = array( 10 // klucz = 0 , 5 => 6 , 3 => 7 , 'a' => 4 , 11 // klucz = 6 (najwyższy indeks całkowity był 5) , '8' => 2 // klucz = 8 (całkowity!) , '02' => 77 // klucz = '02' , 0 => 12 // wartość 10 będzie nadpisana przez 12 ); // pusta tablica $pusta = array();`

Przykład 6-5. Kolekcja
`$kolory = array('czerwony','niebieski','zielony','żółty'); foreach ( $kolory as $kolor ) { echo "Czy lubisz $kolor?\n"; } /* wynik: Czy lubisz czerwony? Czy lubisz niebieski? Czy lubisz zielony? Czy lubisz żółty? */`

Obecnie nie jest możliwa zmiana wartości w tabeli przy użyciu takiej pętli. Można to jednak rozwiązać tak:

Przykład 6-6. Collection
`foreach ($kolory as $klucz => $kolor) { // nie działa: //$kolor = strtoupper($kolor); // działa: $kolory[$klucz] = strtoupper($kolor); } print_r($kolory); /* wynik: Array ( [0] => CZERWONY [1] => NIEBIESKI [2] => ZIELONY [3] => ŻÓŁTY ) */`

Poniższy przykład tworzy tablicę z pierwszym kluczem 1.

Przykład 6-7. Pierwszy klucz 1
`$kwartał = array(1 => 'Styczeń', 'Luty', 'Marzec'); print_r($kwartał); /* wynik: Array ( [1] => 'Styczeń' [2] => 'Luty' [3] => 'Marzec' ) */`

Przykład 6-8. Wypełnianie prawdziwej tablicy
`// wypełnij tablicę zawartością folderu $uchwyt = opendir('.'); while ($plik = readdir($uchwyt)) { $pliki[] = $plik; } closedir($uchwyt);`

Dane w tablicach są uporządkowane. Ich kolejność może być zmieniona za pomocą różnorodnych funkcji sortujących. Więcej na ten temat w rozdziale tablice.

Przykład 6-9. Sortowanie tablic
`sort($pliki); print_r($pliki);`

Ponieważ wartością tablicy może być wszystko, może też nią być inna tablica. Można w ten sposób tworzyć tablice rekursywne i wielowymiarowe.

Przykład 6-10. Tablice rekursywne i wielowymiarowe
`$owoce = array ( "owoce" => array ( "a" => "pomarańcza" , "b" => "banan" , "c" => "jabłko" ) , "liczby" => array ( 1 , 2 , 3 , 4 , 5 , 6 ) , "dziury" => array ( "pierwsza" , 5 => "druga" , "trzecia" ) );`

Poprzedni | Spis treści | Następny
Łańcuchy znaków (string) | Początek rozdziału | Obiekty (object)