Wstęp

Tablice sÄ… bardzo specyficznym typem zmiennych – sÄ… to, najproÅ›ciej mówiÄ…c, zmienne zawierajÄ…ce w sobie uporzÄ…dkowany zbiór zmiennych. Do zmiennych tych uzyskuje siÄ™ dostÄ™p przez liczbÄ™ w nawiasie kwadratowym podane bezpoÅ›rednio po nazwie zmiennej – tablicy. Liczba ta to tak zwany indeks – numer kolejny zmiennej w tablicy. Tak samo przypisuje siÄ™ wartość do tablicy.

Przykład 5.1. Tworzenie tablicy


<?php

$tablica[0] = "Wpis numer 0";
$tablice[1] = "Wpis numer 1";
$tablica[2] = "Wpis numer 2";

echo $tablica[2]; // Wyświetlony zostanie napis "Wpis numer 2";

?>

            

Aby poprostu dodać kolejny wpis na końcu tabeli wystarczy przy przypisywaniu wartości nie wpisywać indeksu do nawiasów kwadratowych. Jeśli w ten sposób dodawane są wpisy do nowej tablicy, to pierwszy wpis ma indeks 0.

Indeks można też podawać ze zmiennej, z innej tablicy czy funkcji – z dowolnego wyrażenia zwracajÄ…cego wartość.

Przykład 5.2. Indeksy tablic


<?php

$tab1[] = 1;
$tab1[] = 0;
$tab1[] = 3;
$tab1[] = 2;

$tab2[] = "Pierwszy";
$tab2[] = "Drugi";
$tab2[] = "Trzeci";
$tab2[] = "Czwarty";

echo $tab2[$tab1[2]];

?>

            

Elementem tablicy może być każdy typ zmiennej (z innymi tablicami i obiektami włącznie).

Tablica asocjacyjna

W PHP wystÄ™puje też inny rodzaj tablic, tak zwane tablice asocjacyjne (zwane też czasem haszami – hash table). SÄ… to tablice, w których zamiast indeksów liczbowych używa siÄ™ identyfikatorów znakowych (kluczy):

Przykład 5.3. Tablice asocjacyjne


<?php

$tablica["imie"] = "Jan";
$tablica["nazwisko"] = "Kowalski";
$tablica["adres"] = "Polna 1";

echo $tablica["imie"]." ".$tablica["nazwisko"].", ul. ".$tablica["adres"]."n";

?>

            

PrzeglÄ…danie tablic

Bardzo często zachodzi potrzeba wykonania jakiejś operacji na wszystkich elementach tablicy. Sprawa jest prosta jeśli tablica jest zwykłą tablicą z indeksami liczbowymi i znamy ilość tych elementów:

Przykład 5.4. Przeglądanie tablic pętlą


<?php

$tbl[] = 1;
$tbl[] = 2;
$tbl[] = 3;
$tbl[] = 4;
$tbl[] = 5;

for( $x = 0; $x < 5; $x++ ) {   // Pętla wykona się 5 razy (0...4)
   
   echo $tbl[$x];

}

?>

            

Sprawa się trochę komplikuje jeśli nie znamy ilości elementów tablicy. Wtedy z pomocą przychodzi funkcja count( $nazwa_tablicy ). Zwraca ona ilość elementów w tablicy podanej jako parametr.

Przykład 5.5. Pętla for i funkcja count


<?php

$tbl[] = 1;
$tbl[] = 2;
$tbl[] = 3;
$tbl[] = 4;
$tbl[] = 5;

for( $x = 0, $cnt = count($tbl); $x < $cnt; $x++ ){

   echo $tbl[$x];
   
}

?>

            

Jeszcze trudniej jest jeÅ›li konieczne jest przejrzenie tablicy asocjacyjnej, ale i to da siÄ™ zaÅ‚atwić. W tym przypadku należy skorzystać z funkcji list() i each(). Nie bÄ™dÄ™ omawiaÅ‚ ich dziaÅ‚ania – jesli kogoÅ› to interesuje, to odsyÅ‚am do manuala PHP. Przy przechodzeniu przez tablice asocjacyjne trzeba wykorzystać pÄ™tlÄ™ while.

Przykład 5.6. Przeglądanie tablic asocjacyjnych


<?php

$tablica["imie"] = "Jan";
$tablica["nazwisko"] = "Kowalski";
$tablica["adres"] = "Polna 1";

while( list($klucz, $wartosc) = each($tablica) )
   echo "$klucz => $wartosc<BR>";

?>

            

Jak widać, w każdej iteracji pętli mamy dostępne 2 zmienne, przyjmujące wartości kolejnych kluczy i wartości przypisanych tym kluczom.

Sortowanie tablic

PHP ofertuje cały zestaw funkcji służących do sortowania tablic. Są to:

  • asort()
  • arsort()
  • ksort()
  • rsort()
  • sort()
  • uasort()
  • usort()
  • uksort()

Większość funkcji (oprócz trzech ostatnich) przyjmuje jeden parametr: zmienną zawierającą tablicę do posortowania. Żadna z funkcji nie zwraca żadnego wyniku.

Funkcje sortujÄ…ce


asort()

sortuje tablice asocjacyjne zachowując przypisanie kluczy do wartości


<?php

$owoce = array ("d"=>"mango", "a"=>"papaja", "b"=>"banan", "c"=>"aronia");
asort ($owoce);
reset ($owoce); // Funkcja ta powoduje powrót do pierwszego elementu tablicy
while (list ($klucz, $wartosc) = each ($owoce)) {
    echo "$klucz = $wartoscn";
}

?>

                     

Wynikiem działania powyższego przykładu powinno być:


c = aronia
b = banan
d = mango
a = papaja

                     

arsort()

sortuje w odwrotnej kolejnoÅ›ci tablice asocjacyjne zachowujÄ…c przypisanie kluczy do wartoÅ›ci. Funkcja prawie identyczna jak poprzednia, tyle że dane sortowane sÄ… „od tyÅ‚u”.


ksort()

sortuje tablice asocjacyjne według kluczy. Powyższy przykład po podmianie funkcji asort na ksort powinna dać poniższy wynik:


a = papaja
b = banan
c = aronia
d = mango

                     

rsort()

sortuje zwykłe tablice (nie asocjacyjne) w odwróconej kolejności


sort()

sortuje zwykłe tablice (nie asocjacyjne) w kolejności alfabetycznej


uasort()

funkcja sortująca tablice asocjacyjne za pomocą zdefiniowanej przez użytkownika funkcji porównującej elementy (nazwa funkcji jest podawana za pomocą drugiego parametru)


usort()

funkcja sortująca zwykłe tablice za pomocą funkcji zdefiniowanej przez użytkownika


uksort()

funkcja sortująca tablice asocjacyjne według klucza za pomocą funkcji zdefiniowanej przez użytkownika.

W trzech ostatnich funkcjach sortujących trzeba jako drugi parametr podać funkcję porównującą elementy tablicy. Jak definiuje się funkcje opisane jest w jednym z następnych rozdziałów. Funkcje takie pobierają 2 argumenty. Zwracane jest 0 jeśli argumenty są sobie równe, -1 jeśli pierwszy argument jest mniejszy od drugiego a 1 jeśli jest większy.

Tworzenie ciągów z tablic i odwrotnie

PHP umożliwia zamianÄ™ ciÄ…gów na tablice i odwrotnie. Zamiana ciÄ…gu na tablicÄ™ jest bardzo przydatna jeÅ›li zachodzi potrzeba wyciÄ…gniÄ™cie jakiegoÅ› fragmentu danych z ciÄ…gu. Załóżmy że w odczytaliÅ›my z pliku z danymi (o odczycie z plików w jednym z kolejnych rozdziałów) liniÄ™ z logu zapisanego przez licznik WWW: „12/11/2000;19:23:33;Netscape Navigator;192.168.1.1”. Jak widać dane rozdzielone sÄ… Å›rednikami. Do rozdzielania ciÄ…gów na tablicÄ™ sÅ‚uży funkcja explode(). Jako pierwszy parametr trzeba do niej podać znak lub dÅ‚uższy ciÄ…g który oddziela kolejne pola, jako drugi ciÄ…g do rozdzielenia. Opcjonalnie można podać trzeci argument, który oznacza maksymalnÄ… liczbÄ™ pól – jeÅ›li jest ich wiÄ™cej niż ta liczba, to ostatnie pole bÄ™dzie zawieraÅ‚o wszystkie pozostaÅ‚e pola. Funkcja zwraca tablicÄ™ zawierajÄ…cÄ… kolejne pola.

Przykład 5.7. Rozdzielenie danych separowanych średnikiem


<?php

$dane = "12/11/2000;19:23:33;Netscape Navigator;192.168.1.1";
$tablica = explode(";", $dane);

?>

            

Jest także rozszerzona wersja funkcji explode: split(). Różni się ona tym, że zamiast prostego ciągu znaków rozdzielających pola, akceptuje ona wyrażenia regularne (co to jest wyrażenie regularne mniej więcej wyjaśniono w rozdziale dotyczącyn ciągów).

Czasem potrzebne jest dziaÅ‚anie w drugÄ… stronÄ™: zÅ‚Ä…cznie pól tablicy w jeden ciÄ…g, w którym pola oddzielone sÄ… jakimÅ› znakiem (lub kilkoma). Do tego sÅ‚uży funkcja implode(). Jako pierwszy parametr podawany jest ciÄ…g za pomocÄ… którego „sklejane” sÄ… elementy tablicy, a jako drugi wÅ‚aÅ›nie tablica do posklejania. Zwracany jest ciÄ…g zawierajÄ…cy posklejane elementy. Jako przykÅ‚ad zastosowania może posÅ‚użyć wÅ‚aÅ›nie zapisywanie danych o użytkowniku w aplikacji licznika odwiedzin – tablica zawiera dane o odwiedzajÄ…cym, a potrzebny jest ciÄ…g pooddzielany Å›rednikami.

Przykład 5.8. Łączenie danych z tablicy


<?php

$dane = implode(";", $tablica);

?>