PHP/Zmienne i tablice: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
→‎Funkcje: dodana uwaga
Zyx (dyskusja | edycje)
korekta formatowania kodu i drobne stylistyczne
Linia 1:
{{Podświetl|php}}
 
{{prognaw|PHP|[[../Pierwszy skrypt/]]|[[../Formularze/]]}}
 
== Zmienne i tablice ==
 
W tym rozdziale dowiesz się, jak PHP przechowuje dane oraz pozwala na zarządzanie nimi.
Samo wyświetlanie tekstu jest niezbyt ciekawe. Wszystkie programy komputerowe operują na danych, zatem w językach programowania muszą istnieć mechanizmy do przechowywania informacji w pamięci. Do tego służą zmienne i tablice, którymi zajmiemy się właśnie teraz.
 
=== Dane ===
Linia 11 ⟶ 10:
8
 
To jest wyrażenie liczbowe reprezentujące liczbę całkowitą.
 
6.454
 
To jest wyrażenie liczbowe reprezentujące ułamek, czyli liczbę zmiennoprzecinkową będącą komputerowym, skończonym przybliżeniem liczby rzeczywistej.
 
0x6F44
Linia 32 ⟶ 31:
Cudzysłów posiada więcej takich kodów formatujących:
 
"\n - tak robimy zejście do nowej linijki w systemach uniksowych (np. Linux)"
"\r - tak kiedyś się robiło w systemach Mac"
"\r\n - a tak wciąż się robi w systemach operacyjnych Windows"
"Wyświetlimy cudzysłów: \" ..."
"Wstawimy tabulator: \t"
Linia 55 ⟶ 54:
'Tekst A '.'Tekst B'
 
Oto wyrażenie będące połączeniem dwóch mniejszych wyrażeń tekstowych. Znaki kropka oraz plus to tzw. '''operatory'''. Wykonują one pewne operacje na dwóch innych wyrażeniach i zwracają jakąś wartość, zatem same także stają się wyrażeniem. Podobnie, jak w matematyce, obowiązuje pewnaściśle określona kolejność ich wykonywania, a zmieniać ją możemy za pomocą nawiasów:
 
5 * (6 + 8)
Linia 63 ⟶ 62:
Pamiętaj, że PHP potrafi automatycznie rozpoznawać typ wyrażenia i w razie potrzeby odpowiednio go konwertować. Dla przykładu instrukcja ''echo'' wymaga danych tekstowych. W skrypcie:
 
<nowikisource lang="php"><?php
echo 7;
 
</source>
echo 7;
 
?></nowiki>
 
Interpreter dokona konwersji liczby na tekst, a dopiero potem spowoduje jego wyświetlenie.
 
=== Funkcje ===
 
Informatyka wiele zawdzięcza matematyce. W programowaniu występuje wiele pojęć zaczerpniętych bezpośrednio od królowej nauk. Jednym z nich jest funkcja, do której możemy wprowadzać parametry, a w zamian otrzymujemy jakiś wynik. Poniższy skrypt będzie pierwszym "naprawdę" dynamicznym, jaki stworzymy. Skorzystamy w nim z dwóch funkcji, aby wyświetlić aktualny czas:
 
<nowikisource lang="php"><?php
 
echo 'Dzisiaj mamy: '.date('d.m.Y').'<br/>';
echo 'Od 1.1.1970 minęło: '.time().' sekund';
 
?></nowikisource>
 
Jak widać, składnia funkcji jest następująca: ''<code>nazwaFunkcji(parametry)''</code>. Jeśli funkcja nie posiada parametrów, nawiasy są puste. Jeżeli jest ich więcej, niż jeden, oddzielamy je od siebie przecinkiem. Zaś sam parametr jest niczym innym, jak... wyrażeniem. Jest nim także funkcja, dlatego możemy ją wpleść w nasz tekst za pomocą operatora kropki.
{{Uwaga|Funkcja '''<code>time()'''</code> wyświetla czas [[w:czas uniksowy|czas uniksowy]], dlatego nie można używać tej funkcji bezpośrednio do określenia ile czasu minęło od konkretnej daty.}}
{{Uwaga|'''<code>echo'''</code> oraz jego synonim '''<code>print'''</code> nie są funkcjami ani wyrażeniami! Są to instrukcje języka PHP i to tłumaczy, dlaczego nie musimy stosować przy nich nawiasów.}}
 
=== Zmienne ===
Innym pojęciem matematycznym jest zmienna reprezentująca informację nieznaną w trakcie pisania skryptu. Jest to taki pojemnik, do którego możemy w trakcie wykonywania skryptu wstawiać wszelkie informacje, zapamiętując je w ten sposób. Bez zmiennych nie można mówić o jakimkolwiek przetwarzaniu danych, ponieważ komputer musi mieć jakąś możliwość umieszczania gdzieś wyników obliczeń oraz przechowywania niezbędnych programom danych.
 
Każda zmienna posiada własną, unikalną nazwę, która jednoznacznie ją identyfikuje. Język PHP wymaga, aby zaczynała się ona od znaku dolara, a następnie od litery lub podkreślenia. Dalsze znaki mogą być także cyframi. Można stosować duże litery, ale dla interpretera ma to istotne znaczenie. ''<code>$zmienna''</code> i ''<code>$Zmienna''</code> to dwie różne zmienne. Przykłady prawidłowych nazw zmiennych:
 
$a, $b, $foo, $_50, $_foo, $moja_zmienna, $mojaZmienna3
Linia 100 ⟶ 98:
Aby przypisać wartość do zmiennej, należy ułożyć wyrażenie z operatorem '''='''. Po lewej stronie umieszczamy naszą zmienną, a po prawej inne wyrażenie określające wstawianą wartość. Oto, jak wygląda to w praktyce:
 
<nowikisource lang="php"><?php
 
// inicjujemy zmienna $czas aktualnym czasem w sekundach od 1.1.1970
$czas = time();
 
// inicjujemy zmienna $czas aktualnym czasem w sekundach od 1.1.1970
echo 'Od 1.1.1970 minęło '.$czas.' sekund<br/>';
$czas = time();
echo 'Od 1.1.1970 minęło '.($czas / 60).' minut<br/>';
echo 'Od 1.1.1970 minęło '.($czas / 3600).' godzin';
 
echo 'Od 1.1.1970 minęło '.$czas.' sekund<br/>';
?></nowiki>
echo 'Od 1.1.1970 minęło '.($czas / 60).' minut<br/>';
echo 'Od 1.1.1970 minęło '.($czas / 3600).' godzin';
</source>
 
W powyższym przykładzie stworzyliśmy zmienną ''<code>$czas''</code>, wprowadzając do niej aktualny czas. Następnie wykorzystaliśmy ją w obliczeniach. Poznaliśmy w ten sposób jedno z zastosowań zmiennych. Zachowaliśmy w nich wynik działania jednej sekcji programu, aby potem używać go wielokrotnie gdzie indziej bez konieczności każdorazowego odwoływania się do funkcji i zbędnego liczenia po sto razy tego samego. Wprawdzie pobieranie aktualnego czasu nie jest czasochłonną operacją, ale na razie jesteśmy jeszcze na początkowym etapie nauki i musimy dbać o prostotę przykładów.
 
PHP, w przeciwieństwie do innych języków programowania, ma bardzo liberalne reguły stosowania zmiennych. W ogóle nie trzeba ich nigdzie deklarować, a interpreter sam na bieżąco dopasuje typ informacji do naszych potrzeb. Dana zmienna jest tworzona podczas pierwszego jej wykorzystania w skrypcie. Jest sporo sytuacji, w których zachowanie to jest pożądane, lecz normalnie może utrudnić ono pracę. Wyobraź sobie taką sytuację: programista potrafi najczęściej bardzo szybko pisać i od czasu do czasu zdarza mu się wcisnąć dwa klawisze w złej kolejności. Powstaje literówka. Jeżeli zostanie ona popełniona podczas wpisywania nazwy, PHP w teorii nie zgłosi tego jako błędu i programista będzie musiał spędzić dużo czasu na jej odnalezienie. Słowo "teoria" nie znalazło się tu przypadkowo. Podczas instalowania PHP wspominaliśmy o poziomach raportowania błędów. Im wyższy poziom, tym większej ilości rzeczy czepia się PHP. Na poziomie ''E_ALL'' zdefiniowanym w rekomendowanym pliku ''php.ini'' takie beztroskie podejście do zmiennych nie jest tolerowane. Tutaj PHP wymaga już, aby podczas pierwszego użycia zmiennej została jej przypisana jakaś wartość, ponieważ inaczej otrzymamy powiadomienie (ang. ''notice'') o próbie odwołania się do nieistniejącej zmiennej. Popatrzmy sobie na ten przykład:
 
<nowikisource lang="php"><?php
 
echo $a * 16 + 5;
</source>
 
Zmienna <code>$a</code> nie została tu wcześniej zadeklarowana. Otwórz swój plik ''php.ini'', odnajdź dyrektywę ''error_reporting'' i zmień jej wartość na <code>E_ALL | ~E_NOTICE</code>. Wyłączysz w ten sposób wyświetlanie powiadomień. Zrestartuj serwer i uruchom powyższy skrypt. Wynikiem powinno być "5". PHP bez pytania podstawił do <code>$a</code> wartość neutralną 0. Przywróć teraz poprzedni poziom (''E_ALL | E_STRICT'') i ponownie uruchom ten skrypt. Oprócz wyniku, ujrzysz też komunikat:
?></nowiki>
 
Zmienna ''$a'' nie została tu wcześniej zadeklarowana. Otwórz swój plik ''php.ini'', odnajdź dyrektywę ''error_reporting'' i zmień jej wartość na ''E_ALL | ~E_NOTICE''. Wyłączysz w ten sposób wyświetlanie powiadomień. Zrestartuj serwer i uruchom powyższy skrypt. Wynikiem powinno być "5". PHP bez pytania podstawił do ''$a'' wartość neutralną 0. Przywróć teraz poprzedni poziom (''E_ALL | E_STRICT'') i ponownie uruchom ten skrypt. Oprócz wyniku, ujrzysz też komunikat:
 
Notice: Undefined variable: a in D:\Serwer\www\katalog\twojskrypt.php on line 3
 
Sytuację można rozwiązać, ręcznie inicjując zmienną ''<code>$a''</code> wartością 0:
 
<nowiki><?php
 
$a = 0;
 
echo $a * 16 + 5;
 
<source lang="php"><?php
?></nowiki>
$a = 0;
echo $a * 16 + 5;
</source>
 
Zalecane jest, aby wszystkie skrypty pracowały bezproblemowo przy włączonych powiadomieniach. Jeżeli zajdzie sytuacja, że odwołanie się do zmiennej, która może jeszcze nie istnieć, jest potrzebne, istnieje kilka sposobów "oszukania" PHP, lecz poznamy je w dalszej części podręcznika.
Linia 139 ⟶ 132:
Początkujący programiści mają tendencję do tworzenia dużej liczby tzw. ''zmiennych tymczasowych'', które nie wnoszą absolutnie niczego do programu poza wydłużeniem kodu i zmniejszeniem wydajności. Po każdym etapie przetworzenia jakiejś informacji, umieszczana jest ona w nowej zmiennej. Takie podejście jest nieprawidłowe. Oto przykłady "złych" skryptów:
 
<nowikisource lang="php"><?php
 
$tekst = 'To jest jakiś tekst';
$tekstMaly = strtolower($tekst);
$tekstBezpieczny = addslashes($tekstMaly);
echo $tekstBezpieczny;
</source>
 
Przykład 2:
?></nowiki>
 
<nowikisource lang="php"><?php
 
$format = 'd.m.Y';
echo date($format);
</source>
 
?></nowiki>
 
W pierwszym skrypcie niepotrzebnie po każdym etapie przetwarzania tekstu tworzymy dla niego nową zmienną. Możemy to poprawić na dwa sposoby. Pierwszy:
 
<nowikisource lang="php"><?php
 
$tekst = 'To jest jakiś tekst';
$tekst = strtolower($tekst);
$tekst = addslashes($tekst);
echo $tekst;
</source>
 
?></nowiki>
 
Drugi, w którym w ogóle opuszczamy zmienne:
 
<nowikisource lang="php"><?php
echo addslashes(strtolower('To jest jakiś tekst'));
 
</source>
echo addslashes(strtolower('To jest jakiś tekst'));
 
?></nowiki>
 
W drugim "złym" skrypcie w ogóle niepotrzebnie tworzymy zmienną; przecież format daty możemy wpisać bezpośrednio do funkcji.
 
<nowikisource lang="php"><?php
echo date('d.m.Y');
?></nowikisource>
 
W tym jednak przypadku może być to uznane za kwestię dyskusyjną. Jeżeli nasz skrypt bardzo często będzie formatować różne daty, a my będziemy chcieli mieć możliwość jej prostego konfigurowania, warto pokusić się o zapisanie formatu w jakiejś zmiennej. W ten sposób poprzez zmianę jej wartości w jednym miejscu zostanie ona uwzględniona w całym skrypcie.
Linia 192 ⟶ 182:
Pierwszym typem skalarnym jest ''liczba całkowita''. Jej angielskim określeniem jest ''integer'' albo ''int''. Może być ona zapisana w trzech systemach liczbowych: dziesiętnym, szesnastkowym albo ósemkowym:
 
<nowikisource lang="php"><?php
$a = 1234; // liczba całkowita
$a = -123; // liczba całkowita ujemna
$a = 0123; // zapis ósemkowy (odpowiednik dziesiętnego 83)
$a = 0x1A; // zapis szesnastkowy (odpowiednik dziesiętnego 26)
?></nowikisource>
 
Możemy także korzystać z wartości ułamkowych zwanych ''liczbami zmiennoprzecinkowymi'' (ang. ''floating point numbers'' albo skrótowo ''float''), które są przybliżeniem liczb rzeczywistych. Przy ich zapisywaniu obowiązują reguły języka angielskiego, więc części całkowite od ułamkowych oddzielamy za pomocą kropki. Także i tu mamy do wyboru kilka sposobów zapisu:
 
<nowikisource lang="php"><?php
$a = 1.234;
$a = 1.2e3;
$a = 7E-10;
?></nowikisource>
 
Specjalnie wyróżniony został tzw. typ logiczny (''boolean'') przyjmujący jedynie wartości '''FALSE''' i '''TRUE'''. Jest on bardzo ważny, ponieważ wiele funkcji generuje właśnie w nim rezultat, czy operacja się powiodła. Wyrażenia porównawcze także generują wartości logiczne.
Linia 211 ⟶ 201:
Ostatnim z typów skalarnych jest ciąg tekstowy (ang. ''string''). Zdążyliśmy już powiedzieć nieco o nim, np. że istnieją dwie składnie zapisywania ciągów. Ta oparta na apostrofach posiada minimalny zestaw kodów formatujących pozwalających na wstawienie do tekstu innych apostrofów oraz ukośników wstecznych:
 
<nowikisource lang="php"><?php
echo 'To jest tekst zapisany w apostrofach. Kody formatujące pozwalają
 
umieścić w tekście wyłącznie inne apostrofy: \' albo backslashe: \\. Wszystko inne,
echo 'To jest tekst zapisany w apostrofach. Kody formatujące pozwalają
np. \n zostanie wyświetlone jako zwyczajny tekst';
umieścić w tekście wyłącznie inne apostrofy: \' albo backslashe: \\. Wszystko inne,
</source>
np. \n zostanie wyświetlone jako zwyczajny tekst';
 
?></nowiki>
 
Uruchom powyższy skrypt i porównaj sobie wynik z przeglądarki z treścią wpisaną w apostrofy. Spróbuj usunąć backslash sprzed apostrofu i zobacz, co się stanie. Skrypt się nie uruchomi, ponieważ wystąpił błąd składni. PHP myśli, że tekst kończy się już tutaj i dalej jest inna część algorytmu, co nie jest oczywiście prawdą. Więcej możliwości formatowania posiada tekst ograniczony cudzysłowami:
 
<nowikisource lang="php"><?php
echo "To jest tekst zapisany w cudzysłowach. Za pomocą kodów formatujących możemy
 
umieszczać wiele rzeczy: \" \\ \n \r \$";
echo "To jest tekst zapisany w cudzysłowach. Za pomocą kodów formatujących możemy
</source>
umieszczać wiele rzeczy: \" \\ \n \r \$";
 
?></nowiki>
 
Cudzysłowy zezwalają na "proste" umieszczanie w nich wartości zmiennych (zm. tymczasowa stworzona dla zilustrowania zagadnienia):
 
<nowikisource lang="php"><?php
$czas = time();
 
echo "Aktualny czas w sekundach: $czas = time()sek.";
</source>
 
echo "Aktualny czas w sekundach: $czas sek.";
 
?></nowiki>
 
Jednak nie nadużywaj tego. Wstawianie zmiennych w ten sposób jest kilka razy wolniejsze, niż łączenie ich z ciągiem operatorem kropki.
 
<nowikisource lang="php"><?php
// mozna takze użyć apostrof
 
echo "Aktualny czas w sekundach: ".time()." sek.";
// mozna takze użyć apostrof
</source>
echo "Aktualny czas w sekundach: ".time()." sek.";
 
?></nowiki>
 
Niektórzy początkujący programiści niezbyt rozumieją ideę tej możliwości i próbują wykorzystywać ciągi do wprowadzania wartości zmiennych jako parametrów do funkcji (zm. tymczasowa użyta dla zilustrowania zagadnienia):
 
<nowikisource lang="php"><?php
$formatDaty = 'd.m.Y';
 
echo date("$formatDaty = 'd.m.Y'");
</source>
echo date("$formatDaty");
 
?></nowiki>
 
Unikaj takiej konstrukcji, jak ognia. Choć PHP ją akceptuje, nie jest to prawidłowe użycie tej struktury języka. Więcej... przy złożonych typach powoduje zniekształcenie danych. Jeżeli spotkasz kogoś piszącego w ten sposób, poinformuj go o tym.
Linia 265 ⟶ 244:
*Do zmiennej przypisana została stała '''NULL'''.
*Do zmiennej nie została przypisana jeszcze żadna wartość (zgłaszane jest wtedy powiadomienie)
*Zmienna została zniszczona poleceniem '''<code>unset()'''</code>.
 
Przyjrzyjmy się wspomnianemu w trzecim punkcie poleceniu. Czasem jakąś zmienną trzeba zniszczyć. Najlepiej nadaje się do tego polecenie '''<code>unset()'''</code>:
 
<nowikisource lang="php"><?php
$zmienna = 4856;
 
unset($zmienna = 4856);
 
echo unset($zmienna);
</source>
 
Zmiennej już nie ma, dlatego polecenie '''echo''' pokaże nam powiadomienie o nieistniejącej zmiennej.
echo $zmienna;
 
?></nowiki>
 
Zmiennej już nie ma, dlatego polecenie '''echo''' nie pokaże nic.
 
==== Konwersja typów ====
Linia 287 ⟶ 264:
Możemy sami wymusić konwersję typów:
 
<nowikisource lang="php"><?php
// wyświetl liczbę całkowitą jako ułamek
 
echo (float) 10;
// wyświetl liczbę całkowitą jako ułamek
</source>
echo (float) 10;
 
?></nowiki>
 
W nawiasie przed wartością piszemy angielską nazwę typu: ''integer'', ''int'', ''string'', ''boolean'', ''float'', ''double'' (liczba zmiennoprzecinkowa mogąca przybierać znacznie większe wartości). Unikaj jakiejkolwiek konwersji typów złożonych: tablic, obiektów, zasobów, gdyż w każdym z tych przypadków informacje zostają całkowicie utracone; zamiast nich zwracana jest po prostu nazwa typu złożonego - to dlatego ostrzegaliśmy przed wprowadzaniem wartości zmiennych do funkcji przez cudzysłowy.
 
PHP posiada funkcję '''<code>gettype()'''</code> zwracającą nazwę aktualnego typu danych zawartych w zmiennej:
 
<nowiki><?php
 
$a = 547;
 
echo 'Typ zmiennej $a to: '.gettype($a);
 
<source lang="php"><?php
?></nowiki>
$a = 547;
echo 'Typ zmiennej $a to: '.gettype($a);
</source>
 
=== Więcej o operatorach ===
Linia 371 ⟶ 343:
Zwróć uwagę na cztery ostatnie pozycje. Wyszczególnione zostały tam tzw. operatory jednoargumentowe, czyli takie, które operują wyłącznie na jednym wyrażeniu. W dodatku koniecznie musi być ono zmienną, ponieważ modyfikują one jej wartość, powiększając lub zmniejszając o jeden. Każdy z tych operatorów został podany podwójnie, ponieważ w zależności od tego, czy postawimy go przed, czy po zmiennej, otrzymamy nieco inne rezultaty. Porównaj:
 
<nowikisource lang="php"><?php
// najpierw składnia $zmienna++
 
$zmienna = 5;
 
echo 'Stan 1: '.($zmienna++).'<br/>';
echo 'Stan 2: '.$zmienna.'<br/><br/>';
 
// teraz składnia ++$zmienna
echo 'Restart zmiennej...<br/>';
$zmienna = 5;
 
echo 'Stan 1: '.(++$zmienna).'<br/>';
echo 'Stan 2: '.$zmienna.'<br/>';
</source>
 
?></nowiki>
 
Skrypt ten wygeneruje nam kilka linijek:
 
<nowiki>Stan 1: 5
Stan 2: 6
 
Restart zmiennej...
Stan 1: 6
Stan 2: 6</nowiki>
 
Przeanalizuj wyniki działania. Okazuje się, że w składni ''<code>$zmienna++''</code> najpierw dostajemy wartość zmiennej, a dopiero potem zwiększamy ją o jeden (dlatego zmiana widoczna jest dopiero w drugim stanie). ''<code>++$zmienna''</code> najpierw powiększa, potem zwraca, w efekcie czego otrzymujemy w obu stanach liczbę "6". Identyczna zasada obowiązuje operator ''--''.
 
Zajmijmy się teraz przypisywaniem danych do zmiennej. Wiemy już, że operator przypisania po lewej stronie wymaga zmiennej, po prawej wyrażenia, którego wartość trzeba w niej umieścić. Skoro operator, jest to też wyrażenie, lecz jaką wartość ono reprezentuje. Okazuje się, że tę, która jest przypisywana. Możemy wobec tego zastosować sprytną sztuczkę, o której wbrew pozorom wie niezbyt wielu programistów. Zainicjujmy pięć zmiennych naraz tą samą wartością:
 
<nowikisource lang="php"><?php
$a = $b = $c = $d = $e = 5;
 
</source>
$a = $b = $c = $d = $e = 5;
 
?></nowiki>
 
PHP najpierw przypisze "5" do zmiennej <code>$e</code>, zwracając jednocześnie "5" tak, by mogło być ono przypisane do <code>$d</code>, potem do <code>$c</code>, <code>$b</code> i na końcu <code>$a</code>. W ten sposób jednym wielkim wyrażeniem zainicjowaliśmy pięć zmiennych naraz.
 
Poznany już operator przypisania nie jest jedynym, jaki istnieje w PHP. Aby ułatwić modyfikację wartości zmiennych o liczby inne niż jeden, stworzono całą gamę operatorów łączących w sobie przypisywanie oraz jakąś operację matematyczną. Oto i one.
Linia 451 ⟶ 420:
Te operatory po prostu skracają zapis i czynią go czytelniejszym. Warto o nich pamiętać szczególnie przy operacjach na ciągach tekstu, kiedy nasz algorytm składa jakąś treść, doczepiając kolejne jej partie do wybranej zmiennej:
 
<nowikisource lang="php"><?php
 
$tekst = 'Litwo, ojczyzno moja! Ty jesteś jak zdrowie<br/>';
$tekst .= 'Ile Cię trzeba cenić, ten tylko się dowie<br/>';
$tekst .= 'Kto Cię stracił, dziś piękność twą w całej ozdobie<br/>';
$tekst .= 'Widzę i opisuję, bo tęsknię po tobie.<br/>';
 
echo $tekst;
</source>
 
?></nowiki>
 
Rezultat:
Linia 501 ⟶ 469:
|}
 
Spróbujmy przenieść taką tabelkę w świat programowania. Widzimy, że wszystkie "igreki" są ze sobą powiązane, ponieważ odgrywająwszystkie podobne role byciamożliwymi wynikami funkcji. Gdyby to zapisać jako zupełnie osobne zmienne, mielibyśmy problem z późniejszym dostaniem się do nich. Popatrz na to w ten sposób: użytkownik wprowadza argument, a my mamy dla niego odnaleźć wartość spośród tych podanych. Skąd PHP może wiedzieć, że akurat ta grupa zmiennych jest ze sobą w jakiś sposób powiązania, a tym bardziej znać regułę wybierania "tej właściwej"? Na razie nie jest to w ogóle możliwe. Co nam pozostaje? Zapisać wszystkie wartości w strukturze zwanej '''tablicą'''.
 
{{Definicja|'''Tablica''' to zmienna zbiorcza, grupująca pojedyncze elementy mające właściwości zmiennych, do których odwoływać możemy się za pomocą indeksów.}}
Linia 507 ⟶ 475:
Wiemy już, że tablica jest zmienną, która grupuje sobie mniejsze zmienne opisywane przez ich indeksy (wartości ''x'' w naszej tabelce funkcji). Najważniejsze jest jednak to, że przy odwoływaniu się do nich, potrzebny nam indeks możemy określić zwyczajnym wyrażeniem! To oznacza, że zadanie wymienione akapit wyżej staje się realne. Zanim je zaprogramujemy, nieco informacji o składni tablic. Na początek utwórzmy pustą tablicę:
 
<nowikisource lang="php"><?php
$tablica = array();
 
</source>
$tablica = array();
 
?></nowiki>
 
Spróbujmy wprowadzić do niej wartości naszej funkcji:
 
<nowikisource lang="php"><?php
$tablica = array(0 => 5, 3, 8, 7, 9, 24, 15, 2, 19);
 
</source>
$tablica = array(0 => 5, 3, 8, 7, 9, 24, 15, 2, 19);
 
?></nowiki>
 
Początkowe "0" określa, od jakiej liczby zacząć numerowanie kolejnych elementów. Po strzałce wymieniamy ich wartości oddzielone przecinkiem. Teraz spróbujmy dostać się do jakiejś z nich.
 
<nowikisource lang="php"><?php
$tablica = array(0 => 5, 3, 8, 7, 9, 24, 15, 2, 19);
 
echo 'Pod numerem 5 kryje się wartość '.$tablica[5];
$tablica = array(0 => 5, 3, 8, 7, 9, 24, 15, 2, 19);
</source>
 
echo 'Pod numerem 5 kryje się wartość '.$tablica[5];
 
?></nowiki>
 
Pomiędzy nawiasami kwadratowymi wprowadzić musimy wyrażenie określające indeks tablicy, który chcielibyśmy odczytać. Możemy teraz pokusić się o napisanie skryptu losującego elementy:
 
<nowikisource lang="php"><?php
$tablica = array(0 => 5, 3, 8, 7, 9, 24, 15, 2, 19);
echo 'Pod numerem 5 kryje się wartość '.$tablica[rand(0, 8)];
</source>
 
W tym skrypcie za wybranie indeksu tablicy odpowiada funkcja <code>rand()</code> zwracająca losową{{ref|1}}wartość z tablicy.
$tablica = array(0 => 5, 3, 8, 7, 9, 24, 15, 2, 19);
 
echo 'Pod numerem 5 kryje się wartość '.$tablica[rand(0, 8)];
 
?></nowiki>
 
W tym skrypcie za wybranie indeksu tablicy odpowiada funkcja ''rand()'' zwracająca losową{{ref|1}}wartość z tablicy.
 
Indeksy tablicy wcale nie muszą być numeryczne. PHP dopuszcza także tekstowe wersje. Mamy wtedy do czynienia z tablicami asocjacyjnymi.
 
<nowikisource lang="php"><?php
$artykul = array(
'tytul' => 'Tytuł artykułu',
'data' => date('d.m.Y'),
'tresc' => 'To jest treść artykułu'
);
 
echo '<h1>'.$artykul = array(['tytul'].'</h1>';
echo '<p>Napisany dnia '.$artykul['data'].'</p>';
'tytul' => 'Tytuł artykułu',
echo '<p>'.$artykul['tresc'].'</p>';
'data' => date('d.m.Y'),
</source>
'tresc' => 'To jest treść artykułu'
);
 
echo '<h1>'.$artykul['tytul'].'</h1>';
echo '<p>Napisany dnia '.$artykul['data'].'</p>';
echo '<p>'.$artykul['tresc'].'</p>';
 
?></nowiki>
 
Mogą istnieć także tablice mieszane, w których występują zarówno indeksy tekstowe, jak i numeryczne. Pamiętaj, że każdy element tablicy zachowuje się, jak zwykła zmienna, dlatego także możesz przypisywać do niego dowolne wartości już po utworzeniu tablicy.
 
<nowikisource lang="php"><?php
 
$tablica = array(0 => 5, 3, 8, 7, 9, 24, 15, 2, 19);
 
// modyfikuj losowy element tablicy
$tablica[rand(0, 8)] = 6;
 
echo '<pre>';
var_dump($tablica);
echo '</pre>';
 
$tablica = array(0 => 5, 3, 8, 7, 9, 24, 15, 2, 19);
?></nowiki>
 
// modyfikuj losowy element tablicy
Najpierw przypisaliśmy do losowego elementu tablicy nową wartość: 6. Całość wyświetlamy funkcją ''var_dump()''. Przydaje się ona przy poszukiwaniu błędów w skrypcie. Potrafi zaprezentować w czytelnej formie każdy typ danych, więc możemy za jej pomocą kontrolować, czy na danym etapie wykonywania rezultaty są takie, jakie być powinny. Podobne działanie ma funkcja ''print_r()''.
$tablica[rand(0, 8)] = 6;
 
echo '<pre>';
Zobacz teraz, jak zachowuje się ''$tablica'', kiedy próbujemy ją wywołać samodzielnie:
var_dump($tablica);
echo '</pre>';
</source>
 
Najpierw przypisaliśmy do losowego elementu tablicy nową wartość: 6. Całość wyświetlamy funkcją <code>var_dump()</code>. Przydaje się ona przy poszukiwaniu błędów w skrypcie. Potrafi zaprezentować w czytelnej formie każdy typ danych, więc możemy za jej pomocą kontrolować, czy na danym etapie wykonywania rezultaty są takie, jakie być powinny. Podobne działanie ma funkcja <code>print_r()</code>.
<nowiki><?php
 
Zobacz teraz, jak zachowuje się <code>$tablica</code>, kiedy próbujemy ją wywołać samodzielnie:
$tablica = array(0 => 5, 3, 8, 7, 9, 24, 15, 2, 19);
 
<source lang="php"><?php
echo $tablica;
$tablica = array(0 => 5, 3, 8, 7, 9, 24, 15, 2, 19);
 
echo $tablica;
?></nowiki>
</source>
 
Skrypt ten pokaże nam tylko jeden napis: ''Array'', czyli... nazwę typu. Właśnie z tego powodu ostrzegaliśmy przed wprowadzaniem danych do funkcji jako ''<code>funkcja("$zmienna");''</code>. Gdyby w zmiennej była tablica, do funkcji zamiast niej dotarłby napis ''Array'' i całość przestałaby działać. Osobną kwestią jest wydajność takiego zmuszania do konwersji do tekstu, a potem z powrotem na tekst właściwy.
 
Upewnij się, że rozumiesz już istotę działania tablic, gdyż bardzo przydadzą się nam one w następnym rozdziale.