You are on page 1of 24

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

PHP5. Wprowadzenie
Autor: David Sklar
Tumaczenie: Robert Grczyski
ISBN: 83-246-0288-7
Tytu oryginau: Learning PHP 5
Format: B5, stron: 352

Poznaj moliwoci jzyka PHP5


Zbuduj komponenty dynamicznych witryn WWW
Wykorzystaj funkcje z biblioteki PEAR
Przetestuj kod i usu bdy
Czas, kiedy statyczne witryny internetowe przycigay rzesze odwiedzajcych,
dawno ju min. Dzi trzeba znacznie wicej, aby zainteresowa uytkownikw
internetu. Doskonale przygotowany projekt graficzny to tylko jeden z elementw.
Najistotniejsza jest jednak zawarto witryny aktualne treci, formularze
umoliwiajce kontakt z twrcami oraz mechanizmy pozwalajce na personalizacj
witryny i przechowywanie artykuw w bazie danych. Doskonaym narzdziem do
tworzenia takich elementw jest PHP5 prosty jzyk programowania o potnych
moliwociach i, co najwaniejsze, dostpny nieodpatnie.
Jeli chcesz nauczy si programowania w tym jzyku, signij po ksik PHP5.
Wprowadzenie. Znajdziesz w niej wszystkie informacje niezbdne do tego, aby
samodzielnie stworzy dynamiczn witryn WWW. Poznasz elementy jzyka PHP
i nauczysz si stosowa je, tworzc elementy strony WWW. Dowiesz si, jak czy
witryn WWW z baz danych i w jaki sposb identyfikowa jej uytkownikw.
Przeczytasz tu rwnie o wykrywaniu i usuwaniu bdw ze skryptw oraz o tym,
do czego moesz zastosowa jzyk PHP.
Operacje na tekstach i liczbach
Sterowanie przebiegiem programu
Tworzenie interaktywnych formularzy
Korzystanie z baz danych
Mechanizmy sesji i obsuga plikw cookie
Przetwarzanie dat
Operacje na plikach
Generowanie i przetwarzanie dokumentw XML
Testowanie kodu i usuwanie bdw
Tchnij ycie w statyczne witryny internetowe wykorzystaj PHP5!

Przedmowa...................................................................................................................... 9
1. Wprowadzenie i pierwsze kroki....................................................................................17
Miejsce PHP w wiecie internetowym
Co wyjtkowego jest w PHP?
PHP w dziaaniu
Podstawowe zasady programw PHP
Podsumowanie rozdziau

17
20
22
27
31

2. Praca z tekstem i liczbami............................................................................................. 33


Tekst
Liczby
Zmienne
Podsumowanie rozdziau
wiczenia

33
42
44
47
48

3. Podejmowanie decyzji oraz powtrki..........................................................................49


Zrozumie wartoci: prawda i fasz
Podejmowanie decyzji
Tworzenie skomplikowanych decyzji
Powtrki
Podsumowanie rozdziau
wiczenia

50
51
53
58
61
61

4. Praca z tablicami............................................................................................................ 63
Podstawy tablic
Wykonywanie ptli na tablicach
Modyfikacja tablic
Sortowanie tablic
Uywanie tablic wielowymiarowych

63
67
72
74
77

Podsumowanie rozdziau
wiczenia

80
81

5. Funkcje ...........................................................................................................................83
Deklarowanie i wywoywanie funkcji
Przekazywanie argumentw do funkcji
Zwracanie wartoci z funkcji
Zrozumienie zasigu zmiennych
Podsumowanie rozdziau
wiczenia

84
85
88
92
95
95

6. Tworzenie formularzy sieciowych ............................................................................... 97


Dostp do parametrw formularza
Przetwarzanie formularzy za pomoc funkcji
Sprawdzanie poprawnoci danych
Wywietlanie wartoci domylnych
Kompletny formularz
Podsumowanie rozdziau
wiczenia

100
103
105
115
117
123
123

7. Przechowywanie informacji w bazach danych ......................................................... 125


Zorganizowanie danych w bazie danych
czenie si z programem bazy danych
Tworzenie tabeli
Umieszczanie danych w bazie danych
Bezpieczne wstawianie danych formularza
Generowanie unikalnego identyfikatora
Kompletny formularz wstawiania danych
Otrzymywanie danych z bazy danych
Zmiana formatu otrzymanych wierszy
Bezpieczne otrzymywanie danych formularza
Kompletny formularz otrzymywania danych
MySQL bez PEAR DB
Podsumowanie rozdziau
wiczenia

126
128
130
131
136
137
138
141
145
147
150
153
157
158

8. Zapamitywanie uytkownikw za pomoc cookies i sesji..................................... 159


Praca z cookies
Aktywacja sesji
Przechowywanie i otrzymywanie informacji
Konfiguracja sesji
Logowanie i identyfikacja uytkownika
6

Spis treci

160
164
165
167
169

Dlaczego funkcje setcookie() i session_start() naley umieszcza


na samej grze strony
Podsumowanie rozdziau
wiczenia

174
175
176

9. Obsuga daty i czasu ....................................................................................................177


Wywietlanie daty lub czasu
Analiza skadniowa daty lub czasu
Data i czas w formularzach
Wywietlanie kalendarza
Podsumowanie rozdziau
wiczenia

177
182
183
192
195
195

10. Praca z plikami..............................................................................................................197


Uprawnienia plikw
Odczytywanie i zapisywanie caych plikw
Praca z plikami CSV
Kontrolowanie uprawnie plikw
Szukanie bdw
Oczyszczanie dostarczonych z zewntrz nazw plikw
Podsumowanie rozdziau
wiczenia

197
198
204
207
207
210
211
212

11. Analiza skadniowa i generowanie dokumentw XML............................................ 213


Analiza skadniowa dokumentu XML
Generowanie dokumentu XML
Podsumowanie rozdziau
wiczenia

214
220
221
222

12. Debugowanie .............................................................................................................. 223


Kontrolowanie miejsc, w ktrych pojawiaj si bdy
Poprawianie bdw skadni
Sprawdzanie danych programu
Poprawianie bdw bazy danych
Podsumowanie rozdziau
wiczenia

223
224
228
231
232
232

13. Co jeszcze mona zrobi za pomoc PHP?................................................................. 235


Grafika
PDF
Shockwave/Flash
Kod dla okrelonej przegldarki

235
236
237
238

Spis treci

Wysyanie i otrzymywanie wiadomoci e-mail


Wysyanie plikw w formularzach
Struktura obsugujca formularze HTML_QuickForm
Klasy i obiekty
Zaawansowane przetwarzanie XML
SQLite
Uruchamianie polece powoki
Zaawansowane operacje matematyczne
Szyfrowanie
Komunikacja z innymi jzykami
IMAP, POP3 i NNTP
Wiersz polece PHP
PHP-GTK
Co jeszcze moesz zrobi za pomoc PHP?

239
240
241
244
246
249
249
250
251
252
252
254
254
255

A Instalacja i konfiguracja interpretera PHP ................................................................. 257


B Podstawy wyrae regularnych................................................................................. 279
C Odpowiedzi do wicze.............................................................................................. 295
Skorowidz .................................................................................................................... 331

Spis treci

ROZDZIA 4.

Tablice s zbiorami powizanych wartoci, na przykad danych wysanych z formularza, nazwisk studentw w grupie lub wielkoci populacji na licie miast. W rozdziale 2. dowiedziae si, e zmienne s nazwanymi staymi, ktre przechowuj warto. Tablica jest pojemnikiem przechowujcym wiele wartoci rnicych si midzy sob.
Dziki temu rozdziaowi dowiesz si, w jaki sposb pracowa z tablicami. Podrozdzia Podstawy tablic zawiera podstawowe informacje na temat tworzenia tablic oraz manipulowania
jej elementami. Niejednokrotnie bdziesz musia wykonywa pewne czynnoci w odniesieniu
do kadego elementu w tablicy, np. wywietli element bd zbada, czy zachodz okrelone warunki. Podrozdzia Wykonywanie ptli na tablicach wyjani kwestie uywania ptli
z tablicami za pomoc konstrukcji foreach() oraz for(). W podrozdziale Modyfikacja tablic wprowadzimy funkcje implode() oraz explode() zamieniajce tablice w acuchy oraz
acuchy na tablice. Innym rodzajem modyfikacji tablicy jest sortowanie, ktre zostanie przeanalizowane w podrozdziale Sortowanie tablic. Na kocu rozdziau, w podrozdziale Uywanie tablic wielowymiarowych zostanie poruszony temat tablic zawierajcych w sobie inne tablice.
Rozdzia 6. z kolei pozwoli Ci zrozumie, w jaki sposb przetwarza dane formularzy, ktre
interpreter PHP automatycznie umieszcza w tablicy. Kiedy otrzymujesz informacje z bazy
danych, jak to zostao opisane w rozdziale 7., dane zostaj czsto umieszczone w tablicy.

Podstawy tablic
Tablica skada si z elementw, za kady element posiada klucz oraz warto. Tablica przechowujca informacje na temat kolorw warzyw posiada nazw warzywa jako klucz oraz kolor
jako warto klucza, co zostao pokazane na rysunku 4.1.
Tablica moe posiada tylko jeden element dla podanego klucza. W tablicy kolorw warzyw
nie moe by innego elementu z kluczem kukurydza, nawet jeli jego wartoci byoby niebieski. Jednake ta sama warto moe pojawia si wielokrotnie w tej samej tablicy. Moesz
wic posiada pomaraczowe marchewki, pomaraczowe mandarynki oraz pomaraczowe
pomaracze.

63

Rysunek 4.1. Klucze i wartoci tablicy

Dowolny acuch lub warto liczbowa moe by elementem klucza tablicy, na przykad ku1
kurydza, 4, -36 lub Solona kaamarnica. Tablice i inne wartoci nieskalarne nie mog by
kluczami, ale mog by elementami wartoci. Element wartoci moe by acuchem, liczb,
wartoci prawda lub fasz, moe by rwnie inn tablic.

Tworzenie tablicy
Aby utworzy tablic, przypisz wartoci poszczeglnym kluczom tablicy. Klucze tablicy s
oznaczane za pomoc nawiasw kwadratowych, jak to zostao przedstawione na listingu 4.1.
Listing 4.1. Tworzenie tablic
// Tablica o nazwie $warzywa z kluczami acuchami.
$warzywa['kukurydza'] = 'ty';
$warzywa['burak'] = 'czerwony';
$warzywa['marchewka'] = 'pomaraczowy';
// Tablica o nazwie $obiad z kluczami liczbowymi.
$obiad[0] = 'Sodka kukurydza ze szparagami';
$obiad[1] = 'Kurczak cytrynowy';
$obiad[2] = 'Duszone grzyby z bambusem';
// Tablica o nazwie $komputery z kluczami liczbowymi oraz acuchami.
$komputery['trs-80'] = 'Radio Shack';
$komputery[2600] = 'Atari';
$komputery['Adam'] = 'Coleco';

Klucze i wartoci tablicy przedstawionej na listingu 4.1 s acuchami (na przykad kukurydza, Duszone grzyby bambusa czy Coleco) i liczbami (na przykad 0, 1 czy 2600). Zostay
napisane podobnie jak inne acuchy i liczby w programach PHP: ze znakami cudzysoww
otaczajcymi acuchy, ale nie liczby.
Tablic moesz rwnie utworzy za pomoc sucej temu konstrukcji jzyka array(). Przykad z listingu 4.2 przedstawia t sam tablic, ktra zostaa ju zaprezentowana w przykadzie z listingu 4.1.
Listing 4.2. Tworzenie tablicy za pomoc konstrukcji array()
$warzywa = array('kukurydza' => 'ty',
'burak' => 'czerwony',
'marchewka' => 'pomaraczowy');
1

Wartoci skalarne opisuj dane, ktre posiadaj pojedyncz warto: liczb, fragment tekstu, warto prawda
lub fasz. Zoone typy danych, na przykad tablice przechowujce wiele wartoci, nie s skalarne.

64

Rozdzia 4. Praca z tablicami

$obiad = array(0 => 'Sodka kukurydza ze szparagami',


1 => 'Kurczak cytrynowy',
2 => 'Duszone grzyby z bambusem');
$komputery = array('trs-80' => 'Radio Shack',
2600 => 'Atari',
'Adam' => 'Coleco');

Za pomoc konstrukcji array() okrelasz list par klucz-warto oddzielon przecinkami.


Natomiast klucz i warto s rozdzielone przez =>. Skadnia array() jest zwiza, dlatego jest
bardziej odpowiednia, gdy w danym momencie dodajesz do tablicy wicej ni jeden element.
Skadnia nawiasw kwadratowych jest lepsza, kiedy dodajesz elementy pojedynczo.

Wybr dobrej nazwy tablicy


W stosunku do nazw tablic obowizuj te same reguy, ktre maj zastosowanie do nazw
zmiennych. Pierwszym znakiem tablicy musi by litera bd cyfra, a pozostae znaki w nazwie musz by literami, cyframi lub znakami podkrelenia. Nazwy tablic i zmiennych skalarnych pochodz z tej samej puli nazw, tak wic nie moesz posiada jednoczenie tablicy
$warzywa oraz zmiennej skalarnej o nazwie $warzywa. Jeeli przypiszesz warto tablicy do
zmiennej skalarnej lub na odwrt, wwczas stara warto zostanie usunita, a zmienna otrzyma nowy typ. W przykadzie na listingu 4.3 zmienna $warzywa staje si skalarna, a zmienna
$owoce staje si tablic.
Listing 4.3. Tablice a kolizje skalarne
// Poniszy wiersz przeksztaca zmienn $warzywa w tablic.
$warzywa['kukurydza'] = 'ty';
// Usunicie wszelkich ladw po "kukurydza" i "ty" powoduje, e
// tablica $warzywa staje si skalarna.
$warzywa = 'wyborne';
// Poniszy wiersz powoduje, e tablica $owoce staje si skalarna.
$owoce = 283;
// Zmienia zmienn $owoce w tablic i usuwa poprzedni warto skalarn.
$owoce['potas'] = 'banan';

Na listingu 4.1 tablice $warzywa oraz $komputery przechowyway list powiza. Tablica
$warzywa wizaa warzywa z kolorami, podczas gdy tablica $komputery wizaa nazwy komputerw i producentw. Jednake w tablicy $obiad zatroszczylimy si o nazwy posikw,
ktre byy wartociami tablicy. Klucze tablicy s po prostu liczbami, ktre odrniaj jeden
element od drugiego.

Tworzenie tablic liczbowych


PHP daje moliwo wykorzystania pewnych skrtw do pracy z tablicami, ktrych klucze
to wycznie liczby. Jeeli utworzysz tablic za pomoc konstrukcji array(), okrelajc jedynie list wartoci zamiast par klucz-warto, interpreter PHP automatycznie przypisze kadej
wartoci klucz liczbowy. Klucze rozpoczynaj si od 0 i zwikszaj o 1 w przypadku kadego elementu. Kod przedstawiony na listingu 4.4 wykorzystuje t technik do utworzenia tablicy $obiad.

Podstawy tablic

65

Listing 4.4. Tworzenie tablic liczbowych za pomoc konstrukcji array()


$obiad = array('Sodka kukurydza ze szparagami',
'Kurczak cytrynowy',
'Duszone grzyby z bambusem');
print "Chciabym $obiad[0] oraz $obiad[1].";

Wykonanie kodu przedstawionego na listingu 4.4 spowoduje wywietlenie:


Chciabym Sodka kukurydza ze szparagami oraz Kurczak cytrynowy.

Wewntrznie interpreter PHP traktuje jednakowo tablice z kluczami liczbowymi oraz tablice
z kluczami acuchami (jak i rwnie tablice z mieszanymi kluczami liczbowymi i acuchami). Z powodu podobiestwa do funkcji w innych jzykach programowania programici czsto odwouj si do tablic z kluczami wycznie liczbowymi jako do tablic liczbowych,
indeksowanych lub uporzdkowanych oraz do tablic z acuchami jako do tablic asocjacyjnych. Innymi sowy, z tablic asocjacyjn mamy do czynienia wtedy, gdy jej klucze s
wyranie czym innym ni pozycjami wartoci wewntrz tablicy.
W trakcie tworzenia przez Ciebie tablicy PHP automatycznie zwiksza o jednostk liczb dla
kluczy tablicy oraz dodaje do niej elementy z pustymi nawiasami kwadratowymi, co zostao
przedstawione na listingu 4.5.
Listing 4.5. Dodawanie elementw za pomoc skadni []
// Utwrz tablic $lunch zawierajc dwa elementy.
// Powoduje to ustawienie $lunch[0]
$lunch[] = 'Suszone grzyby w przyrumienionym sosie';
// Powoduje to ustawienie $lunch[1]
$lunch[] = 'Ananas i grzyb';
// Tworzy tablic $obiad zawierajc trzy elementy.
$obiad = array('Sodka kukurydza ze szparagami', 'Kurczak cytrynowy',
'Duszone grzyby z bambusem');
// Dodaj element na kocu tablicy $obiad.
// Powoduje to ustawienie $obiad[3]
$obiad[] = 'Skrzydeko na ostro';

Puste nawiasy kwadratowe dodaj element do tablicy. Element posiada klucz liczbowy, ktry ma warto o jeden wiksz ni dotychczasowy najwikszy klucz obecny w tablicy. Jeeli
tablica jeszcze nie istnieje, puste nawiasy kwadratowe dodadz element z kluczem 0.
Tworzenie pierwszego elementu posiadajcego klucz 0, a nie 1 odbiega od sposobu
mylenia zwykego czowieka (rni si od logiki przyjtej przez programistw komputerowych), tak wic wymaga przypomnienia. Pierwszym elementem tablicy z kluczem liczbowym jest 0, a nie 1.

Poznawanie rozmiaru tablicy


Funkcja count() informuje o liczbie elementw w tablicy. Przykad przedstawiony na listingu 4.6 prezentuje uycie funkcji count().
Listing 4.6. Poznawanie rozmiaru tablicy
$obiad = array('Sodka kukurydza ze szparagami',
'Kurczak cytrynowy',
'Duszone grzyby z bambusem');

66

Rozdzia 4. Praca z tablicami

$posilki = count($obiad);
print "Mamy $posilki potrawy na obiad.";

Wykonanie kodu z listingu 4.6 spowoduje wywietlenie:


Mamy 3 potrawy na obiad.

Kiedy przekaesz pust tablic (to znaczy tablic nie zawierajc elementw), funkcja zwrci
0. W wyraeniach testowych konstrukcji if() pusta tablica przyjmie warto fasz.

Wykonywanie ptli na tablicach


Jedn z najczstszych czynnoci wykonywanych za pomoc tablic jest indywidualne rozpatrywanie kadego elementu w tablicy i jego przetwarzanie. Dziaanie to moe obejmowa wczenie elementu do wiersza tabeli HTML lub dodanie jego wartoci do funkcjonujcej caoci.
Najatwiejszym sposobem przechodzenia przez kolejne elementy tablicy jest zastosowanie
funkcji foreach(). Konstrukcja foreach() pozwala na jednokrotne uruchomienie bloku kodu dla kadego elementu tablicy. Przykad z listingu 4.7 wykorzystuje funkcj foreach() do
wywietlenia tabeli HTML zawierajcej kady element tablicy.
Listing 4.7. Wykonywanie ptli za pomoc polecenia foreach()
$posilek = array('sniadanie' => 'Woskie orzechy',
'lunch' => 'Orzechy i biae grzyby',
'przekaska' => 'Suszone morwy',
'obiad' => 'Bakaan z sosem chili');
print "<table>\n";
foreach ($posilek as $klucz => $wartosc) {
print "<tr><td>$klucz</td><td>$wartosc</td></tr>\n";
}
print '</table>';

Wykonanie kodu z listingu 4.7 spowoduje wywietlenie nastpujcych wierszy:


<table>
<tr><td>sniadanie</td><td>Woskie orzechy </td></tr>
<tr><td>lunch</td><td>Orzechy i biae grzyby</td></tr>
<tr><td>przekaska</td><td>Suszone morwy </td></tr>
<tr><td>obiad</td><td>Bakaan z sosem chili</td></tr>
</table>

Dla kadego elementu w tablicy $posilek konstrukcja foreach() kopiuje klucz elementu do
zmiennej $klucz oraz warto do zmiennej $wartosc. Nastpnie uruchamia blok kodu zawarty
wewntrz nawiasw klamrowych. Program z listingu 4.7 powoduje wywietlenie zmiennych
$klucz i $wartosc wraz z pewnym kodem HTML w wierszu tabeli. Dla klucza i jego wartoci
wewntrz bloku kodu moesz uy jakichkolwiek nazw zmiennych. Jednak jeli nazwy zmiennych zostay uyte przed konstrukcj foreach(), zostan nadpisane wartociami z tablicy.
Kiedy uywasz konstrukcji foreach() do wywietlenia danych w tabeli HTML, czsto chcesz
zastosowa naprzemienne kolory lub style dla kadego wiersza tabeli. Jest to bardzo atwe
do osignicia, jeeli przechowujesz wartoci naprzemiennych kolorw w oddzielnej tablicy.
Nastpnie przecz zmienn pomidzy 0 a 1 za kadym razem, gdy konstrukcja foreach()
ma wywietli odpowiedni kolor. W przykadzie z listingu 4.8 wyborowi podlegaj dwie wartoci koloru w tablicy $kolor_wiersza.

Wykonywanie ptli na tablicach

67

Listing 4.8. Naprzemienne kolory wiersza tabeli


$kolor_wiersza = array('red','green');
$index_koloru = 0;
$posilek = array('sniadanie' => 'Woskie orzechy',
'lunch' => 'Orzechy i biae grzyby',
'przekaska' => 'Suszone morwy',
'obiad' => 'Bakaan z sosem chili');
print "<table>\n";
foreach ($posilek as $klucz => $wartosc) {
print '<tr bgcolor="' . $kolor_wiersza[$index_koloru] . '">';
print "<td>$klucz</td><td>$wartosc</td></tr>\n";
// Poniszy wiersz przecza $index_koloru midzy 0 a 1.
$index_koloru = 1 - $index_koloru;
}
print '</table>';

Kod przedstawiony na listingu 4.8 spowoduje wywietlenie nastpujcych wierszy:


<table>
<tr bgcolor="red"><td>sniadanie</td><td>Woskie orzechy</td></tr>
<tr bgcolor="green"><td>lunch</td><td>Orzechy i biae grzyby</td></tr>
<tr bgcolor="red"><td>przekaska</td><td>Suszone morwy</td></tr>
<tr bgcolor="green"><td>obiad</td><td>Bakaan z sosem chili</td></tr>
</table>

Zmiana zmiennych ptli takich jak $klucz i $wartosc wewntrz bloku kodu foreach() nie
wpywa na rzeczywist tablic. Jeeli chcesz zmieni tablic, uyj zmiennej $klucz jako indeksu w tablicy. Technika ta zostaa przedstawiona na listingu 4.9 do podwojenia ceny kadego elementu tablicy.
Listing 4.9. Modyfikacja tablicy za pomoc konstrukcji foreach()
$posilek = array('Woskie orzechy' => 1,
'Orzechy i biae grzyby' => 4.95,
'Suszone morwy' => 3.00,
'Bakaan z sosem chili' => 6.50);
foreach ($posilek as $potrawa => $cena) {
// zapis $cena = $cena * 2 NIE dziaa.
$posilek[$potrawa] = $posilek[$potrawa] * 2;
}
// Przejd przez kolejne elementy tablicy i wywietl zmienione wartoci.
foreach ($posilek as $potrawa => $cena) {
printf("Nowa cena potrawy %s to %.2f.\n",$potrawa,$cena);
}

Wykonanie kodu przedstawionego powyej spowoduje wywietlenie:


Nowa
Nowa
Nowa
Nowa

cena
cena
cena
cena

potrawy
potrawy
potrawy
potrawy

Woskie orzechy to 2.00 z.


Orzechy i biae grzyby to 9.90 z.
Suszone morwy to 6.00 z.
Bakaan z sosem chili to 13.00 z.

W przypadku konstrukcji foreach() wystpuje te bardziej zwiza forma do zastosowania


z tablicami liczbowymi. Jej uycie zostao przedstawione na listingu 4.10.
Listing 4.10. Uycie konstrukcji foreach() z tablicami liczbowymi
$obiad = array('Sodka kukurydza ze szparagami',
'Kurczak cytrynowy',
'Duszone grzyby z bambusem');

68

Rozdzia 4. Praca z tablicami

foreach ($posilek as $potrawa) {


print "Moesz zje: $posilek\n";
}

Wykonanie kodu z listingu 4.10 spowoduje wywietlenie:


Moesz zje: Sodka kukurydza ze szparagami
Moesz zje: Kurczak cytrynowy
Moesz zje: Duszone grzyby z bambusem

W tej formie konstrukcji foreach() po prostu okrelie jedn nazw zmiennej, a kady element zosta skopiowany do tej zmiennej wewntrz bloku kodu. Jednake wewntrz bloku
kodu nie moesz uzyska dostpu do klucza elementu.
Aby monitorowa za pomoc konstrukcji foreach() swoj pozycj w tablicy, musisz uy
oddzielnej zmiennej, ktrej warto bdziesz zwiksza o jeden przy kadym wykonaniu bloku kodu konstrukcji foreach(). Wykorzystujc polecenie for(), otrzymasz dokadn pozycj w zmiennej ptli. Ptla foreach() wskae Ci warto kadego elementu tablicy, natomiast
ptla for() poda Ci pozycj kadego elementu tablicy. Nie ma struktury ptli, ktra podawaaby jednoczenie i warto kadego elementu, i jego pooenie.
Zatem jeli chcesz wiedzie, na ktrym zatrzymae si elemencie w trakcie kolejnego przechodzenia przez tablic liczbow, zamiast konstrukcji foreach() uyj polecenia for(). Twoja
ptla for() powinna polega na zmiennej ptli rozpoczynajcej si od 0 i koczcej na wartoci o jeden mniejszej od cakowitej liczby elementw tablicy. Ten mechanizm zosta przedstawiony na listingu 4.11.
Listing 4.11. Kolejne przechodzenie przez elementy tablicy liczbowej za pomoc ptli for()
$obiad = array('Sodka kukurydza ze szparagami',
'Kurczak cytrynowy',
'Duszone grzyby z bambusem');
for ($i = 0, $liczba_potraw = count($obiad); $i < $liczba_potraw; $i++) {
print "Potraw numer $i jest $obiad[$i]\n";
}

Wynikiem dziaania powyszego listingu bdzie wywietlenie nastpujcych wierszy:


Potraw numer 1 jest Sodka kukurydza ze szparagami
Potraw numer 2 jest Kurczak cytrynowy
Potraw numer 3 jest Duszone grzyby z bambusem

Podczas przechodzenia przez kolejne elementy tablicy za pomoc funkcji for() masz do dyspozycji dziaajcy licznik, dostpny dla elementu tablicy, w ktrym jeste. Uyj tego licznika
w poczeniu z operatorem wspczynnika do uzyskania naprzemiennych kolorw wiersza
tabeli. Odpowiedni kod zosta przedstawiony na listingu 4.12.
Listing 4.12. Naprzemienne kolory wiersza tabeli uzyskane za pomoc funkcji for()
$kolor_wiersza = array('red','green');
$obiad = array('Sodka kukurydza ze szparagami',
'Kurczak cytrynowy',
'Duszone grzyby z bambusem');
print "<table>\n";
for ($i = 0, $liczba_potraw = count($obiad); $i < $liczba_potraw; $i++) {
print '<tr bgcolor="' . $kolor_wiersza[$i % 2] . '">';
print "<td>Element $i</td><td>$obiad[$i]</td></tr>\n";
}
print '</table>';

Wykonywanie ptli na tablicach

69

Przykad z listingu 4.12 okrela prawidowy kolor wiersza tabeli za pomoc $i % 2. Warto
wynosi na przemian: 0 i 2, a $i jest parzyste i nieparzyste. Nie ma potrzeby wykorzystania
oddzielnej zmiennej, jak na przykad $index_koloru w listingu 4.8, do przechowywania odpowiedniego koloru wiersza. Wynikiem dziaania listingu 4.12 bdzie:
<table>
<tr bgcolor="red"><td>Element 1</td><td>Sodka kukurydza ze szparagami</td></tr>
<tr bgcolor="green"><td>Element 2</td><td>Kurczak cytrynowy</td></tr>
<tr bgcolor="red"><td>Element 3</td><td>Duszone grzyby z bambusem</td></tr>
</table>

Kiedy przechodzisz przez kolejne elementy tablicy za pomoc konstrukcji foreach(), elementy staj si dostpne w kolejnoci, w jakiej zostay dodane do tablicy. Pierwszym dostpnym
jest element dodany jako pierwszy, drugi dodany element jest kolejnym i tak dalej. Jeeli posiadasz tablic liczbow, ktrej elementy zostay dodane w innej kolejnoci ni ich klucze s
zwykle uporzdkowane, moe to spowodowa powstanie nieoczekiwanych wynikw. Program z listingu 4.13 nie wywietli elementw tablicy w kolejnoci alfabetycznej czy liczbowej.
Listing 4.13. Kolejno elementw tablicy a funkcja foreach()
$litery[0]
$litery[1]
$litery[3]
$litery[2]

=
=
=
=

'A';
'B';
'D';
'C';

foreach ($litery as $litera) {


print $litera;
}

Wykonanie powyszego programu spowoduje wywietlenie:


ABDC

Aby zagwarantowa dostp do elementw w porzdku liczbowym klucza, uyj polecenia


for() do przejcia przez ptl:
for ($i = 0, $liczba_liter = count($litery); $i < $liczba_liter; $i++) {
print $litery[$i];
}

Wynikiem dziaania powyszego kodu bdzie:


ABCD

Jeli szukasz okrelonego elementu w tablicy, nie musisz przechodzi kolejno przez ca tablic, aby go znale. S bardziej efektywne sposoby na odszukanie poszczeglnego elementu. Aby sprawdzi element z okrelonym kluczem, uyj funkcji array_key_exists(), ktra
zostaa przedstawiona na listingu 4.14. Funkcja zwraca warto prawda, jeeli element z dostarczonym kluczem istnieje w tablicy.
Listing 4.14. Sprawdzanie elementu z okrelonym kluczem
$posilek = array('Woskie orzechy' => 1,
'Orzechy i biae grzyby' => 4.95,
'Suszone morwy' => 3.00,
'Bakaan z sosem chili' => 6.50,
'Krewetki' => 0); // Krewetki s za darmo!
$ksiazki = array("Przewodnik po chiskich znakach dla asuchw",
'Jak gotowa i je chiskie potrawy');

70

Rozdzia 4. Praca z tablicami

// To jest prawda.
if (array_key_exists('Krewetki',$posilek)) {
print "Tak, posiadamy krewetki.";
}
// To jest fasz.
if (array_key_exists('Kanapka ze stekiem',$posilek)) {
print "Posiadamy kanapk ze stekiem.";
}
// To jest prawda.
if (array_key_exists(1, $ksiazki)) {
print "Element 1 to ksika Jak gotowa i je chiskie potrawy";
}

Aby sprawdzi element o okrelonej wartoci, uyj funkcji in_array(), jak to zostao przedstawione na listingu 4.15.
Listing 4.15. Sprawdzenie elementu z okrelon wartoci
$posilek = array('Woskie orzechy' => 1,
'Orzechy i biae grzyby' => 4.95,
'Suszone morwy' => 3.00,
'Bakaan z sosem chili' => 6.50,
'Krewetki' => 0);
$ksiazki = array("Przewodnik po chiskich znakach dla asuchw",
'Jak gotowa i je chiskie potrawy');
// To jest prawda: klucz Suszone morwy posiada warto 3.00.
if (in_array(3, $posilek)) {
print 'Cena wynosi 3 z za sztuke.';
}
// To jest prawda.
if (in_array('Jak gotowa i je chiskie potrawy', $ksiazki)) {
print "Posiadamy ksik Jak gotowa i je chiskie potrawy.";
}
// To jest fasz: funkcja in_array() jest wraliwa na wielko liter.
if (in_array("przewodnik po chiskich znakach dla asuchw", $books)) {
print "Posiadamy ksik Przewodnik po chiskich znakach dla asuchw.";
}

Funkcja in_array() zwraca warto prawda, jeli znajdzie element o zadanej wartoci. W przypadku tej funkcji wielko liter w trakcie porwnywania acuchw ma znaczenie. Funkcja
array_search() jest podobna do funkcji in_array(), rni si jednak od niej tym, e jeli
znajdzie szukany element, to zwraca klucz elementu zamiast wartoci prawda. W przykadzie
na listingu 4.16 funkcja array_search() zwraca nazw potrawy, ktra kosztuje 6,50 z.
Listing 4.16. Znajdowanie elementu o okrelonej wartoci
$posilek = array('Woskie orzechy' => 1,
'Orzechy i biae grzyby' => 4.95,
'Suszone morwy' => 3.00,
'Bakaan z sosem chili' => 6.50,
'Krewetki' => 0);
$potrawa = array_search(6.50, $posilek);
if ($potrawa) {
print "$potrawa kosztuje 6.50 z.";
}

Wynikiem dziaania kodu z listingu 4.16 bdzie wywietlenie wiersza:


Bakaan z sosem chili kosztuje 6.50 z.

Wykonywanie ptli na tablicach

71

Modyfikacja tablic
Moesz operowa na indywidualnych elementach tablicy, podobnie jak na zmiennych skalarnych, uywajc do tego operatorw arytmetycznych, logicznych i innych. Kod na listingu
4.17 przedstawia pewne operacje na elementach tablicy.
Listing 4.17. Operacje na elementach tablicy
$potrawy['Woowina Chow Foon'] = 12;
$potrawy['Woowina Chow Foon']++;
$potrawy['Pieczona kaczka'] = 3;
$potrawy['total'] = $potrawy['Woowina Chow Foon'] + $potrawy['Pieczona kaczka'];
if ($potrawy['total'] > 15) {
print "Zjade za duo: ";
}
print 'Zjade ' . $potrawy['Woowina Chow Foon'] . ' dania Woowina Chow Foon.';

Kod z listingu 4.17 wywietli:


Zjade za duo: Zjade 13 dania Woowina Chow Foon.

Wstawianie wartoci elementu tablicy w acuch otoczony znakami podwjnego cudzysowu


lub dokumenty typu here document jest podobne do wstawiania liczb lub znakw. Najatwiejszym sposobem jest zawarcie elementu tablicy w acuchu bez umieszczania znakw cudzysowu wok klucza elementu. Zostao to przedstawione na listingu 4.18.
Listing 4.18. Wstawianie wartoci elementu tablicy w acuch otoczony znakami podwjnego cudzysowu
$posilki['sniadanie'] = 'Woskie orzechy';
$posilki['lunch'] = 'Bakaan z sosem chili';
$ilosci = array(3, 6);
print "Na niadanie chciabym zje $posilki[sniadanie], a na lunch ";
print "chciabym $posilki[lunch]. Poprosz $ilosci[0] na niadanie oraz ";
print "$ilosci[1] na lunch.";

Wykonanie programu z listingu 4.18 spowoduje wywietlenie:


Na niadanie chciabym zje Woskie orzechy, a na lunch
chciabym Bakaan z sosem chili. Poprosz 3 na niadanie oraz
6 na lunch.

Mechanizm wstawiania widoczny na listingu 4.18 funkcjonuje jedynie z kluczami tablicy, ktre skadaj si wycznie z liter, liczb oraz znakw podkrelenia. Jeeli posiadasz klucz tablicy zawierajcy znaki odstpu bd inne znaki interpunkcyjne, wstaw je w nawiasy klamrowe, jak to zostao przedstawione na listingu 4.19.
Listing 4.19. Wstawianie wartoci elementu tablicy za pomoc nawiasw klamrowych
$posilki['Woskie orzechy'] = '3.95 z';
$wezly['www.przyklad.com'] = 'witryna internetowa';
print "Woskie orzechy kosztuj {$posilki['Woskie orzechy']}.";
print "www.przyklad.com to jest {$wezly['www.przyklad.com']}.";

W wyniku dziaania powyszego programu otrzymamy:

72

Rozdzia 4. Praca z tablicami

Woskie orzechy kosztuj 3.95 z.


www.przyklad.com to jest witryna internetowa.

W acuchach otoczonych znakami podwjnego cudzysowu lub dokumentach typu here document jest obliczane wyraenie zawarte wewntrz nawiasw klamrowych, a nastpnie jego
warto zostaje umieszczona w acuchu. W listingu 4.19 uytymi wyraeniami s samodzielne elementy tablicy, tak wic wartoci elementw zostaj wczone do acuchw.
Do usunicia elementu z tablicy suy funkcja unset():
unset($posilki['Pieczona kaczka']);

Usunicie elementu za pomoc funkcji unset() nie jest po prostu ustawieniem elementowi
wartoci 0 lub pustego acucha. Kiedy uywasz unset() element nie jest duej brany pod
uwag w trakcie przechodzenia przez tablic lub obliczania liczby elementw w tablicy. Uycie funkcji unset() na tablicy przedstawiajcej spis produktw sprzedawanych w sklepie jest
podobne do stwierdzenia, e sklep nie bdzie duej oferowa tego produktu. Ustawienie
wartoci elementu na 0 lub jako pusty acuch oznacza, e danego produktu tymczasowo nie
ma w sklepie.
Jeli bdziesz chcia od razu wywietli wszystkie wartoci w tablicy, najszybciej osigniesz
to, uywajc funkcji implode(). Tworzy ona acuch przez poczenie wszystkich wartoci
w tablicy, ktre rozdziela separatorem acucha. Kod z listingu 4.20 wywietla list potraw,
ktrych nazwy s oddzielone przecinkami.
Listing 4.20. Utworzenie acucha z tablicy za pomoc funkcji implode()
$potrawy = array('Pieczony kurczak','Faszerowana kaczka','Ciasto dyniowe');
$menu = implode(', ', $potrawy);
print $menu;

Wykonanie programu z listingu 4.20 spowoduje wywietlenie:


Pieczony kurczak, Faszerowana kaczka, Ciasto dyniowe

Aby rozbi tablic bez znakw rozdzielajcych, jako pierwszego argumentu funkcji implode()
uyj pustego acucha:
$litery = array('A','B','C','D');
print implode('',$litery);

Powyszy kod spowoduje wywietlenie:


ABCD

Uyj funkcji implode(), aby uproci wywietlanie wierszy tabeli HTML, jak to zostao przedstawione na listingu 4.21.
Listing 4.21. Wywietlanie tabeli HTML za pomoc funkcji implode()
$potrawy = array('Pieczony kurczak','Faszerowana kaczka','Ciasto dyniowe');
print '<tr><td>' . implode('</td><td>',$potrawy) . '</td></tr>';

Uruchomiony program z listingu 4.21 wywietli:


<tr><td>Pieczony kurczak</td><td>Faszerowana kaczka</td><td>Ciasto dyniowe</td></tr>

Funkcja implode() umieszcza swoje separatory midzy kad wartoci, a wic do utworzenia kompletnego wiersza tabeli bdziesz musia rwnie wywietli przed pierwszym elementem znacznik otwierajcy wiersz oraz za ostatnim elementem znacznik zamykajcy.

Modyfikacja tablic

73

Odwrotnoci funkcji implode() jest funkcja explode(). Powoduje ona rozbicie acucha
i przeksztacenie go do postaci tablicy. Argumentem separatora dla funkcji explode() jest
acuch, ktry powinien szuka elementw rozdzielajcych tablic. Przykad uycia funkcji
explode() zosta zamieszczony na listingu 4.22.
Listing 4.22. Zamiana acucha na tablic za pomoc funkcji explode()
$ryby = 'Oko, Karp, Szczupak, Fldra';
$lista_ryb = explode(', ', $ryby);
print "Drug ryb z listy jest $lista_ryb[1]";

Wykonanie programu z listingu 4.22 spowoduje wywietlenie:


Drug ryb z listy jest Karp.

Sortowanie tablic
Mamy kilka sposobw na sortowanie tablic. Uycie konkretnej funkcji zaley od tego, jak
chcesz posortowa swoj tablic oraz jakiego jest ona rodzaju.
Funkcja sort() sortuje tablice wedug wartoci elementw. Powinna by uywana jedynie na
tablicach liczbowych, poniewa w trakcie sortowania resetuje klucze. Przykad z listingu 4.23
przedstawia pewne tablice przed sortowaniem i po nim.
Listing 4.23. Sortowanie za pomoc funkcji sort()
$obiad = array('Sodka kukurydza ze szparagami',
'Kurczak cytrynowy',
'Duszone grzyby z bambusem');
$posilek = array('sniadanie' => 'Woskie orzechy',
'lunch' => 'Orzechy i biae grzyby',
'przekaska' => 'Suszone morwy',
'obiad' => 'Bakaan z sosem chili');
print "Przed sortowaniem:\n";
foreach ($obiad as $klucz => $wartosc) {
print " \$obiad: $klucz $wartosc\n";
}
foreach ($posilek as $klucz => $wartosc) {
print "
\$posilek: $klucz $wartosc\n";
}
sort($obiad);
sort($posilek);
print "Po sortowaniu:\n";
foreach ($obiad as $klucz => $wartosc) {
print " \$obiad: $klucz $wartosc\n";
}
foreach ($posilek as $klucz => $wartosc) {
print "
\$posilek: $klucz $wartosc\n";
}

Uruchomiony program z listingu 4.23 wywietli nam:


Przed sortowaniem:
$obiad: 0 Sodka kukurydza ze szparagami
$obiad: 1 Kurczak cytrynowy
$obiad: 2 Duszone grzyby z bambusem
$posilek: sniadanie Woskie orzechy

74

Rozdzia 4. Praca z tablicami

$posilek: lunch Orzechy i biae grzyby


$posilek: przekaska Suszone morwy
$posilek: obiad Bakaan z sosem chili
Po sortowaniu:
$obiad: 0 Duszone grzyby z bambusem
$obiad: 1 Kurczak cytrynowy
$obiad: 2 Sodka kukurydza ze szparagami
$posilek: 0 Bakaan z sosem chili
$posilek: 1 Orzechy i biae grzyby
$posilek: 2 Suszone morwy
$posilek: 3 Woskie orzechy

Obie tablice zostay przeorganizowane w kolejnoci rosncej wartoci elementu. Pierwsz wartoci w tablicy $obiad jest teraz Duszone grzyby z bambusem, natomiast w tablicy $posilek
pierwsz wartoci jest Bakaan z sosem chili. Klucze w tablicy $obiad nie zostay zmienione, poniewa bya ona tablic liczbow, zanim zostaa posortowana. Jednake klucze w tablicy $posilek zostay zastpione przez liczby od 0 do 3.
W celu posortowania tablicy asocjacyjnej uyj funkcji asort(), ktra trzyma klucze razem
z ich wartociami. Kod z listingu 4.24 przedstawia tablic $posilek z listingu 4.23 posortowan za pomoc funkcji asort().
Listing 4.24. Sortowanie za pomoc funkcji asort()
$posilek = array('sniadanie' => 'Woskie orzechy',
'lunch' => 'Orzechy i biae grzyby',
'przekaska' => 'Suszone morwy',
'obiad' => 'Bakaan z sosem chili');
print "Przed sortowaniem:\n";
foreach ($posilek as $klucz => $wartosc) {
print "
\$posilek: $klucz $wartosc\n";
}
asort($posilek);
print "Po sortowaniu:\n";
foreach ($posilek as $klucz => $wartosc) {
print "
\$posilek: $klucz $wartosc\n";
}

Wykonanie powyszego programu spowoduje wywietlenie:


Przed sortowaniem:
$posilek: sniadanie Woskie orzechy
$posilek: lunch Orzechy i biae grzyby
$posilek: przekaska Suszone morwy
$posilek: obiad Bakaan z sosem chili
Po sortowaniu:
$posilek: obiad Bakaan z sosem chili
$posilek: lunch Orzechy i biae grzyby
$posilek: przekaska Suszone morwy
$posilek: sniadanie Woskie orzechy

Przy zastosowaniu funkcji asort() wartoci zostay posortowane w ten sam sposb, jak to miao miejsce w przypadku uycia funkcji sort() ale tym razem klucze znajduj si obok siebie.
Podczas gdy funkcje sort() oraz asort() sortuj tablice wedug wartoci elementu, to dziki
funkcji ksort() moesz rwnie posortowa tablic wedug klucza. Utrzymuje ona razem
pary klucz-warto, ale ustawia kolejno par wedug klucza. Na listingu 4.25 tablica $posilek
zostaa posortowana za pomoc funkcji ksort().
Sortowanie tablic

75

Listing 4.25. Sortowanie za pomoc funkcji ksort()


$posilek = array('sniadanie' => 'Woskie orzechy',
'lunch' => 'Orzechy i biae grzyby',
'przekaska' => 'Suszone morwy',
'obiad' => 'Bakaan z sosem chili');
print "Przed sortowaniem:\n";
foreach ($posilek as $klucz => $wartosc) {
print "
\$posilek: $klucz $wartosc\n";
}
ksort($posilek);
print "Po sortowaniu:\n";
foreach ($posilek as $klucz => $wartosc) {
print "
\$posilek: $klucz $wartosc\n";
}

W wyniku dziaania kodu z listingu 4.25 otrzymamy:


Przed sortowaniem:
$posilek: sniadanie Woskie orzechy
$posilek: lunch Orzechy i biae grzyby
$posilek: przekaska Suszone morwy
$posilek: obiad Bakaan z sosem chili
Po sortowaniu:
$posilek: lunch Orzechy i biae grzyby
$posilek: obiad Bakaan z sosem chili
$posilek: przekaska Suszone morwy
$posilek: sniadanie Woskie orzechy

Tablica zostaje przeorganizowana, a klucze s teraz uporzdkowane rosnco w kolejnoci alfabetycznej. Kady element pozostaje niezmieniony; take warto przypisana do klucza przed
sortowaniem jest po sortowaniu taka sama dla kadego klucza. Jeeli korzystajc z funkcji
ksort(), sortujesz tablic liczbow, wwczas elementy przyjmuj taki ukad, e klucze zostaj uporzdkowane w rosncej kolejnoci liczbowej. Jest to ta sama kolejno, od ktrej rozpoczynasz podczas tworzenia tablicy za pomoc konstrukcji array() bd [].
Funkcje sortujce tablice sort(), asort() oraz ksort() maj swoje odpowiedniki sortujce
w kolejnoci malejcej. Tymi funkcjami s odpowiednio rsort(), arsort() oraz krsort().
Mechanizm dziaania tych funkcji jest identyczny z zasad dziaania wspomnianych wczeniej funkcji sort(), asort() i ksort(), z t tylko rnic, e sortuj tablice od najwikszego
(lub alfabetycznie ostatniego) klucza lub wartoci, a ich kolejne elementy s ukadane w kolejnoci malejcej. Przykad z listingu 4.26 przedstawia w dziaaniu funkcj arsort().
Listing 4.26. Sortowanie za pomoc funkcji arsort()
$posilek = array('sniadanie' => 'Woskie orzechy',
'lunch' => 'Orzechy i biae grzyby',
'przekaska' => 'Suszone morwy',
'obiad' => 'Bakaan z sosem chili');
print "Przed sortowaniem:\n";
foreach ($posilek as $klucz => $wartosc) {
print "
\$posilek: $klucz $wartosc\n";
}
arsort($posilek);
print "Po sortowaniu:\n";

76

Rozdzia 4. Praca z tablicami

foreach ($posilek as $klucz => $wartosc) {


print "
\$posilek: $klucz $wartosc\n";
}

Efektem dziaania powyszego kodu jest wywietlenie nastpujcych wierszy:


Przed sortowaniem:
$posilek: sniadanie Woskie orzechy
$posilek: lunch Orzechy i biae grzyby
$posilek: przekaska Suszone morwy
$posilek: obiad Bakaan z sosem chili
Po sortowaniu:
$posilek: sniadanie Woskie orzechy
$posilek: przekaska Suszone morwy
$posilek: lunch Orzechy i biae grzyby
$posilek: obiad Bakaan z sosem chili

Uywanie tablic wielowymiarowych


Jak ju zostao to wspomniane we wczeniejszym podrozdziale, Podstawy tablic, warto
elementu tablicy moe by inn tablic. Taka moliwo jest uyteczna, gdy zachodzi potrzeba przechowywania danych, ktre bd bardziej skomplikowan struktur, a nie po prostu
kluczem i pojedyncz wartoci. Standardowa para klucz-warto jest wystarczajca do porwnania nazwy posiku (na przykad sniadanie lub lunch) z pojedyncz potraw (na przykad Woskie orzechy lub Kurczak z orzechami). Co si jednak stanie, kiedy kady posiek
bdzie si skada z niejednej potrawy? Wwczas wartoci elementw powinny by tablicami,
a nie acuchami.
Uycie konstrukcji array() do utworzenia tablic, ktre zawieraj wicej tablic jako wartoci
elementw, zostao przedstawione na listingu 4.27.
Listing 4.27. Utworzenie tablic wielowymiarowych za pomoc konstrukcji array()
$posilki = array('sniadanie' => array('Woskie orzechy','Kawa'),
'lunch' => array('Orzechy','Biae grzyby'),
'przekaska' => array('Suszone morwy','Solony krab z sezamem'));
$lunche = array( array('Kurczak','Bakaan','Ry'),
array('Woowina','Szarlotka','Makaron'),
array('Bakaan','Tofu'));
$przyprawy = array('Japonska' => array('gorce' => 'wasabi',
'sone' => 'sos sojowy'),
'Chinska' => array('gorce' => 'musztarda',
'pikantne' => 'jesion'));

Dostp do elementw w tych tablicach tablic jest uzyskiwany przez uycie wikszej iloci
nawiasw kwadratowych identyfikujcych elementy. Kady zbir nawiasw kwadratowych
okrela jeden poziom w caej tablicy. Kod na listingu 4.28 prezentuje, w jaki sposb uzyska
dostp do elementw tablic zdefiniowanych na listingu 4.27.
Listing 4.28. Dostp do elementw tablic wielowymiarowych
print
print
print
print
print
print

$posilki['lunch'][1];
$posilki['przekaska'][0];
$lunche[0][0];
$lunche[2][1];
$przyprawy['Japonska']['sone'];
$przyprawy['Chinska']['gorce'];

//
//
//
//
//
//

Biae grzyby
Suszone morwy
Kurczak
Tofu
sos sojowy
musztarda

Uywanie tablic wielowymiarowych

77

Kady poziom tablicy jest nazwany wymiarem. Wszystkie tablice umieszczone w rozdziale
przed tym podrozdziaem byy tablicami jednowymiarowymi. Kada z nich posiadaa jeden poziom kluczy. Tablice takie jak $posilki, $lunche i $przekaski przedstawione w listingu
4.28 s nazwane tablicami wielowymiarowymi, poniewa kada z nich posiada wicej ni jeden
wymiar.
Tablice wielowymiarowe moesz rwnie utworzy i modyfikowa za pomoc skadni nawiasw kwadratowych. Na listingu 4.29 zostay przedstawione pewne modyfikacje przeprowadzane na tablicach wielowymiarowych.
Listing 4.29. Manipulacje tablicami wielowymiarowymi
$ceny['obiad']['Sodka kukurydza ze szparagami'] = 12.50;
$ceny['lunch']['Orzechy i biae grzyby'] = 4.95;
$ceny['obiad']['Duszony bambus z grzybami'] = 8.95;
$ceny['obiad']['ogolem'] = $ceny['obiad']['Sodka kukurydza ze szparagami'] +
$ceny['obiad']['Duszony bambus z grzybami'];
$specjalnosci[0][0] = 'Kasztanowe bueczki';
$specjalnosci[0][1] = 'Woskie orzechy';
$specjalnosci[0][2] = 'Orzeszki zmiemne';
$specjalnosci[1][0] = 'Saatka';
$specjalnosci[1][1] = 'Woska saatka';
// Pomijajc dodanie indeksu na kocu tablicy,
// tworzymy $specjalnosci[1][2]
$specjalnosci[1][] = 'Saatka z orzeszkw ziemnych';

Do kolejnego przechodzenia przez kady wymiar tablicy wielowymiarowej uyj zagniedonej ptli foreach() lub for(). W kodzie z listingu 4.30 do kolejnego przechodzenia przez
wielowymiarow tablic asocjacyjn zostaa wykorzystana konstrukcja foreach().
Listing 4.30. Przejcie za pomoc foreach() przez kolejne wymiary tablicy wielowymiarowej
$przyprawy = array('Japonska' => array('gorca' => 'wasabi',
'sona' => 'sos sojowy'),
'Chinska' => array('gorca' => 'musztarda',
'pikantna' => 'jesion'));
// Zmienna $kultura jest kluczem, a zmienna $przyprawy_kultury to warto (tablicy).
foreach ($przyprawy as $kultura => $przyprawy_kultury) {
// $przyprawa jest kluczem, a $przyklad jest wartoci.
foreach ($przyprawy_kultury as $przyprawa => $przyklad) {
print "$culture przypraw $flavor jest $example.\n";
}
}

Uruchomienie programu z listingu 4.30 spowoduje wywietlenie:


Japonska gorca przypraw jest wasabi.
Japonska sona przypraw jest sos sojowy.
Chinska gorca przypraw jest musztarda.
Chinska pikantna przypraw jest jesion.

Pierwsza ptla foreach() na listingu 4.30 powoduje przejcie przez pierwszy wymiar tablicy
$przyprawy. Klucze przechowywane w zmiennej $kultura s acuchami Japonska i Chinska.
Natomiast wartoci przechowywane przez zmienn $przyprawy_kultury s tablicami bdcymi wartoci elementw tego wymiaru. Kolejne przejcie ptli foreach() przez te tablice
78

Rozdzia 4. Praca z tablicami

wartoci elementw kopiuje klucze takie jak gorca i sona do tablicy $przyprawy, a wartoci, na przykad wasabi i sos sojowy, do zmiennej $przyklad. Blok kodu nalecy do drugiej ptli foreach() uywa zmiennych z obu polece foreach() do wywietlenia kompletnego komunikatu.
Podobnie jak zagniedone ptle foreach() przechodzce kolejno przez wielowymiarow
tablic asocjacyjn, zagniedone ptle for() przechodz kolejno przez wielowymiarowe tablice liczbowe, jak to zostao przedstawione na listingu 4.31.
Listing 4.31. Przejcie za pomoc for() przez kolejne wymiary tablicy wielowymiarowej
$specjalnosci = array( array('Kasztanowe bueczki', 'Woskie orzechy', 'Orzeszki
ziemne'),
array('Saatka','Woska saatka', 'Saatka z orzeszkw ziemnych') );
// Zmienna $liczba_specjalnosci wynosi 2: jest to liczba elementw w pierwszym wymiarze
// tablicy $specjalnosci.
for ($i = 0, $liczba_specjalnosci = count($specjalnosci); $i < $liczba_specjalnosci;
$i++) {
// Zmienna $liczba_podelementow wynosi 3: jest to liczba elementw w kadej podtablicy.
for ($m = 0, $liczba_podelementow = count($specjalnosci[$i]); $m <
$liczba_podelementow; $m++) {
print "Element [$i][$m] to " . $specjalnosci[$i][$m] . "\n";
}
}

Wykonanie powyszego programu spowoduje wywietlenie:


Element
Element
Element
Element
Element
Element

[0][0]
[0][1]
[0][2]
[1][0]
[1][1]
[1][2]

to
to
to
to
to
to

Kasztanowe bueczki
Woskie orzechy
Orzeszki ziemne
Saatka
Woska saatka
Saatka z orzeszkw ziemnych

W listingu 4.31 dane wyjciowe ptli for() przechodz przez dwa elementy tablicy $specjalnosci. Wewntrzna ptla for() przechodzi przez kady element podtablic, ktre przechowuj odmienne acuchy. W poleceniu wywietlajcym print argument $i jest indeksem
w pierwszym wymiarze (elementy tablicy $specjalnosci), natomiast $m jest indeksem w drugim wymiarze (podtablicy).
W celu umieszczania wartoci z tablicy wielowymiarowej w acuchu otoczonym znakami
podwjnego cudzysowu lub dokumencie typu here document uyj skadni nawiasw klamrowych przedstawionej na listingu 4.19. W kodzie z listingu 4.32 zostay uyte nawiasy klamrowe do interpolacji w celu uzyskania takich samych danych wyjciowych, jak w przypadku
listingu 4.31. W rzeczywistoci jedynym innym wierszem w listingu 4.32 jest ten, zawierajcy
polecenie print.
Listing 4.32. Interpolacja elementu tablicy wielowymiarowej
$specjalnosci = array( array('Kasztanowe bueczki', 'Woskie orzechy', 'Orzeszki
ziemne'),
array('Saatka','Woska saatka', 'Saatka z orzeszkw ziemnych') );
// Zmienna $liczba_specjalnosci wynosi 2: jest to liczba elementw w pierwszym wymiarze
// tablicy $specjalnosci.
for ($i = 0, $liczba_specjalnosci = count($specjalnosci); $i < $liczba_specjalnosci;
$i++) {

Uywanie tablic wielowymiarowych

79

// Zmienna $liczba_podelementow wynosi 3: jest to liczba elementw w kadej podtablicy.


for ($m = 0, $liczba_podelementow = count($specjalnosci[$i]); $m <
$liczba_podelementow; $m++) {
print "Element [$i][$m] to {$specjalnosci[$i][$m]}\n";
}
}

Podsumowanie rozdziau
W rozdziale czwartym zostay przedstawione nastpujce zagadnienia:
Podstawowe komponenty tablicy: elementy, klucze i wartoci.
Dwa sposoby definiowania tablicy w programach: za pomoc konstrukcji array() oraz

przy uyciu nawiasw kwadratowych.


Pojcie skrtw dostarczanych przez PHP dla tablic z kluczami liczbowymi.
Zliczanie liczby elementw w tablicy.
Przejcie przez kady element tablicy za pomoc funkcji foreach().
Naprzemienne kolory wierszy tabeli zastosowanie funkcji foreach() oraz tablicy war-

toci kolorw.
Modyfikacja wartoci elementu tablicy wewntrz bloku kodu foreach().
Odwiedzanie kadego elementu tablicy liczbowej za pomoc funkcji for().
Naprzemienne kolory wierszy tabeli zastosowanie funkcji foreach() oraz operatora

wspczynnika (%).
Zrozumienie kolejnoci, w ktrej konstrukcje foreach() i for() przechodz przez ele-

menty tablicy.
Sprawdzanie elementu tablicy z okrelonym kluczem.
Sprawdzanie elementu tablicy z okrelon wartoci.
Interpolacja wartoci elementu tablicy do acucha.
Usuwanie elementu z tablicy.
Generowanie acuchw z tablicy za pomoc funkcji implode().
Generowanie tablicy z acucha za pomoc funkcji explode().
Sortowanie tablicy przy uyciu funkcji sort(), asort() lub ksort().
Odwrotne sortowanie tablicy.
Definiowanie tablicy wielowymiarowej.
Dostp do poszczeglnych elementw tablicy wielowymiarowej.
Przejcie do kadego elementu w tablicy wielowymiarowej za pomoc funkcji foreach()

bd for().
Interpolacja elementw tablicy wielowymiarowej do acucha.

80

Rozdzia 4. Praca z tablicami

wiczenia
1. Na podstawie danych zebranych przez amerykaski urzd statystyczny (Biura ds. Spisu
Ludnoci) 10 najwikszych miast amerykaskich (wedug wielkoci populacji) w 2000
roku to:
Nowy Jork, NY (8 008 278 osb)
Los Angeles, CA (3 694 820 osb)
Chicago, IL (2 896 016 osb)
Houston, TX (1 953 631 osb)
Filadelfia, PA (1 517 550 osb)
Phoenix, AZ (1 321 045 osb)
San Diego, CA (1 223 400 osb)
Dallas, TX (1 188 580 osb)
San Antonio, TX (1 144 646 osb)
Detroit, MI (951 270 osb)

Zdefiniuj tablic (lub tablice), ktre bd przechowywa te informacje o pooeniu i wielkoci populacji. Wywietl tabel pooenia oraz informacji o wielkoci populacji, ktra
bdzie zawiera ogln wielko populacji we wszystkich dziesiciu miastach.

2. Zmodyfikuj swj program z poprzedniego wiczenia tak, aby wiersze w tabeli wynikowej byy uoone wedug wielkoci populacji. Nastpnie zmodyfikuj program w taki sposb, aby wiersze zostay uoone w kolejnoci wedug nazw miast.
3. Ponownie dokonaj modyfikacji programu z wiczenia pierwszego w taki sposb, aby tabela zawieraa rwnie wiersze przechowujce ogln wielko populacji dla kadego
stanu przedstawionego na licie miast.
4. Odnoszc si do kadego przedstawionego poniej rodzaju informacji, okrel, w jaki sposb przechowywaby te informacje w tablicy, a nastpnie podaj przykadowy kod, ktry
tworzy tak tablic z kilkoma elementami. Na przykad w przypadku pierwszego elementu mgby powiedzie: Tablica asocjacyjna, ktrej kluczem jest nazwisko studenta,
natomiast wartoci w tablicy asocjacyjnej jest ocena oraz numer identyfikacyjny (patrz
poniej):
$uczniowie = array('Jan Kowalski' => array('ocena' => '5+', 'id' => 271231),
('Aneta Nowak' => array('ocena' => '5', 'id' => 818211));

a. Oceny i numery identyfikacyjne uczniw w klasie.


b. Jak wiele sztuk kadego towaru jest przechowywanych w magazynie.
c. Spis obiadw w szkole na cay tydzie rne rodzaje kadego z posikw (przystawka, danie gwne, napj itd.) oraz koszt na kady dzie.
d. Imiona osb w Twojej rodzinie.
e. Imiona, wiek oraz powizania z Tob osb z Twojej rodziny.

wiczenia

81

You might also like