Professional Documents
Culture Documents
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
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
33
42
44
47
48
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
100
103
105
115
117
123
123
126
128
130
131
136
137
138
141
145
147
150
153
157
158
Spis treci
160
164
165
167
169
174
175
176
177
182
183
192
195
195
197
198
204
207
207
210
211
212
214
220
221
222
223
224
228
231
232
232
235
236
237
238
Spis treci
239
240
241
244
246
249
249
250
251
252
252
254
254
255
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
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
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.
Podstawy tablic
65
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.
66
$posilki = count($obiad);
print "Mamy $posilki 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.
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.
67
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);
}
cena
cena
cena
cena
potrawy
potrawy
potrawy
potrawy
68
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";
}
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>';
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';
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
// 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.";
}
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.';
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']}.";
72
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;
Aby rozbi tablic bez znakw rozdzielajcych, jako pierwszego argumentu funkcji implode()
uyj pustego acucha:
$litery = array('A','B','C','D');
print implode('',$litery);
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>';
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]";
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";
}
74
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";
}
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
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
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
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";
}
}
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
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";
}
}
[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++) {
79
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
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
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));
wiczenia
81