W tym artykule rozszerzymy wiedzę na temat tablic oraz opiszemy operatory matematyczne oferowane przez PHP.
Więcej na temat zmiennych
W PHP w przeciwieństwie do wielu innych języków programowania nie deklaruje się z góry typu zmiennych. Każda używana w programie zmienna może przechowywać dane dowolnego, wspieranego przez PHP typu, co więcej, w czasie pracy programu możemy używać jednej zmiennej do przechowywania danych różnego typu, w zależności od aktualnej potrzeby. Oto typy obsługiwane przez PHP: łańcuchy znaków, liczby (całkowite oraz zmiennoprzecinkowe), zmienne logiczne, tablice, identyfikatory zasobów, obiekty, null.
Łańcuchy znaków
Łańcuchy znaków zostały dość dokładnie opisane w artykule \”Instalacja i konfiguracja serwera Apache oraz PHP\”. Więcej dowiemy się o nich przy okazji omawiania funkcji operujących na łańcuchach znaków.
Liczby
Typ ten obejmuje zarówno liczby całkowite, jak i ułamki. Ułamki są zapisywane z użyciem kropki oddzielającej cześć całkowitą od części ułamkowej:
- 1.123 – poprawnie zapisana liczba zmiennoprzecinkowa,
- 1,123 – niepoprawnie zapisana liczba – cześć ułamkowa od części całkowitej musi zostać oddzielona znakiem kropki, a nie przecinkiem.
Liczby całkowite można zapisywać tradycyjnie w systemie dziesiętnym. Czasami jednak wygodniej jest korzystać z liczb zapisanych w systemie szesnastkowym, szczególnie gdy zachodzi potrzeba operowania bezpośrednio na bitach (w PHP nie jest to częsta praktyka). Liczby zapisane w systemie szesnastkowym należy poprzedzić 0x:
- 0xff – jest to odpowiednik liczby 255 w systemie dziesiętnym,
- 0xa1 – jest to odpowiednik liczby 161 w systemie dziesiętnym.
Jeszcze rzadziej zachodzi potrzeba korzystania z systemu ósemkowego. Jednak w razie potrzeby PHP oferuje taką możliwość. Jeśli chcemy zapisać liczbę w systemie ósemkowym, musimy poprzedzić ją 0 (zerem):
- 077 – jest to odpowiednik liczby 63 w systemie dziesiętnym,
- 015 – jest to odpowiednik liczby 13 w systemie dziesiętnym.
Pamiętajmy wiec, że 02 i 2 to nie to samo.
Zmienne logiczne
Są to zmienne przyjmujące jedynie jedną z dwóch wartości: {stala}true{/stala} (prawda) lub {stala}false{/stala} (fałsz):
Podczas programowania wykorzystywane są one bardzo często, lecz nie zawsze jawnie – co zauważymy, gdy zapoznamy się ze strukturami sterującymi dostępnymi w PHP (takimi jak instrukcje warunkowe czy pętle).
Tablice
Tablice są szczególnym przypadkiem zmiennych. Podczas gdy zmienne wszystkich innych typów mogą przyjmować jedynie pojedynczą wartość (liczbę, łańcuch znaków czy też jedną z wartości logicznych), to tablice mogą jednocześnie przechowywać wiele wartości dowolnego typu. Do tworzenia tablic używa się instrukcji {stala}array(){/stala}, w której podaje się rozdzielone przecinkami wartości mające być elementami tablicy:
W pokazany sposób zadeklarowaliśmy tablicę zawierającą trzy elementy: łańcuch znaków, liczbę oraz wartość logiczną. Do każdej z tych wartości można się w skrypcie swobodnie odwoływać za pomocą tak zwanych indeksów. Wartości tablicy indeksowane są od 0 – łańcuch znaków zawiera indeks 0, liczbie przyporządkowany został indeks 1, natomiast zmiennej logicznej indeks 2. Do odwoływania się do poszczególnych elementów tablicy służy nawias kwadratowy, w którym podaje się indeks interesującego nas elementu:
W wyniku wykonania powyższego skryptu wypisany zostanie napis \”Ala ma kota\”. W każdej chwili można także dodać nowy element do już utworzonej tablicy:
Aby dodać element na koniec tablicy (czyli tak, aby ten nowy element był jednocześnie ostatnim elementem naszej tablicy), należy skorzystać z pustych nawiasów kwadratowych ([]). Nic jednak nie stoi na przeszkodzie, by dodać element na z góry określone (dowolne) miejsce. Wówczas trzeba jawnie podać indeks, pod którym chcemy umieścić nowy element:
Teraz nasza tablica zawiera elementy o indeksach 0, 1, 2 oraz 5. W ramach indeksu możemy używać zmiennej z odpowiednią wartością ({stala}$tablica[$zmienna]{/stala}).
Należy pamiętać, że indeksami w tablicach PHP mogą być jedynie liczby całkowite. Dodatkowo, jeśli przypiszemy nową wartość elementowi znajdującemu się już w tablicy, stara wartość zostanie zastąpiona nową:
Często wygodniejsze od indeksów liczbowych jest użycie indeksów zbudowanych z łańcucha znaków. Tablica taka nosi nazwę tablicy asocjacyjnej. Tworzy się ją podobnie jak tablicę opisaną wyżej, jednak polecenie ar array() przyjmuje elementy zapisane w postaci \’indeks\’ => wartość (tak jak poprzednio wszystkie elementy rozdzielamy przecinkami):
\'Jan\',
\'nazwisko\' => \'Kowalski\',
\'wiek\' => 20
);
echo $tablica[\'imie\'];
?>
W tym przykładzie została zdefiniowana tablica asocjacyjna opisująca Jana Kowalskiego. Zawiera ona jego imię, nazwisko oraz wiek. Do poszczególnych elementów tablicy możemy odwoływać się podobnie jak poprzednio, jednak tym razem jako indeksów musimy użyć odpowiednich łańcuchów znaków. Tablice mogą zawierać elementy dowolnego typu, także inne tablice, tworząc tym samym tablice wielowymiarowe:
\'Jan\',
\'nazwisko\' => \'Kowalski\',
\'wiek\' => 38,
\'dzieci\' => array (
\'chłopcy\' => array(
array (
\'imie\' => \'Macius\',
\'wiek\' => 3,
),
),
\'dziewczynki\' => array(
array (
\'imie\' => \'Ola\',
\'wiek\' => 3,
),
),
),
);
echo \'Chłopiec: \'.$tablica[\'dzieci\'][\'chłopcy\'][0] [\'imie\'].\' wiek \'.$tablica[\'dzieci\'][\'chłopcy\'][0] [\'wiek\'];
?>
Nasza {stala}$tablica{/stala} zawiera podtablice pod indeksem dzieci. W niej zaś dwie dodatkowe tablice o indeksach chłopcy oraz dziewczynki. Każda z tych tablic zawiera dodatkowe, indeksowane automatycznie cyframi (od 0) tablice z informacjami o dzieciach Jana Kowalskiego. Aby pobrać imię pierwszego chłopca (są oni indeksowani automatycznie od 0), musimy zapisać następującą linijkę:
$tablica[\'dzieci\'][\'chłopcy\'][0][\'imie\']
Jeśli na podstawie powyższego przykładu mamy problem ze zrozumieniem funkcjonowania tablic wielowymiarowych lub dostępu do poszczególnych jej elementów, rys. 1 powinien wszystko wyjaśnić.
Identyfikatory zasobów oraz obiekty
Tymi rodzajami zmiennych zajmiemy się w przyszłości. Dziś wystarczy, że wiemy o ich istnieniu.
NULL
Typ przyjmujący jedynie wartość NULL. Jest to specjalna wartość informująca, że zmienna nie ma żadnej wartości.
Operatory matematyczne
Z programowaniem nieodłącznie związana jest matematyka. Najczęściej podczas programowania aplikacji internetowych nie potrzebujemy wykonywać zaawansowanych obliczeń, wystarczają podstawowe operacje arytmetyczne.
PHP pozwala oczywiście na dodawanie, odejmowanie, dzielenie. W tabeli 1 zostały zebrane operacje arytmetyczne wspierane przez PHP. Zobaczmy jak to działa:
\";
$roznica = $a - $b;
echo \"Różnica: $roznica
\";
$iloczyn = $a * $b;
echo \"Iloczyn: $iloczyn
\";
$iloraz = $a / $b;
echo \"Iloraz: $iloraz
\";
$reszta = $a % $b;
echo \"Reszta z dzielenia: $reszta
\";
?>
Operatory te występują w jeszcze jednej postaci, która pozwala często skrócić zapis wyrażeń arytmetycznych. Wyrażenia w postaci:
$a = $a operator wyrażenie
można zastąpić wyrażeniem:
$a operator = wyrażenie
Oto przykład:
\';
$liczba1 += $liczba2; // to to samo co $liczba1 = $liczba1 + $liczba2
echo $liczba1.\'
\';
$liczba1 += 10*$liczba2; // to to samo co $liczba1 = $liczba1 + (10*$liczba2)
echo $liczba1.\'
\';
?>
Początkowo zapis taki może wydawać się nieczytelny, jednak z czasem, po oswojeniu się z nim, zaczyna być bardzo wygodny.
Warto jeszcze zwrócić uwagę na dwa inne, często używane operatory: {stala}++{/stala} oraz {stala}–{/stala}. Są to odpowiednio operator inkrementacji i dekrementacji. Powodują one odpowiednio zwiększenie lub zmniejszenie wartości zmiennej o jeden. Występują w dwóch postaciach:
\';
$liczba = 10;
echo ++$liczba;
echo \'
\';
$liczba = 10;
$wynik = 10*5 + $liczba++;
echo $wynik.\'
\';
$liczba = 10;
$wynik = 10*5 + ++$liczba;
echo $wynik.\'
\';
?>
Po wykonaniu powyższego skryptu otrzymamy:
10
11
60
61
Przykład ten dość dobrze obrazuje różnice w działaniu operatorów {stala}++{/stala} oraz {stala}–{/stala} w zależności od tego, czy znajdują się one przed, czy za zmienną. Operator umieszczony po zmiennej zostaje zastosowany po wykonaniu operacji, w której bierze udział zmienna. Jeśli jednak operator umieścimy przed zmienną, jej wartość zostanie zwiększona przed wykonaniem operacji, w której zmienna bierze udział (tak wiec zmienna ta podczas wykonywania tej operacji będzie miała już nowa wartość).
Warto zauważyć jeszcze jedną rzecz, typową dla PHP. Sprawdzimy, co się stanie, jeśli wykonamy następujący program:
Program wypisze:
{stala}Wynik: 20{/stala}
Przyjrzyjmy się jednak, co zostało przypisane do zmiennej {stala}$liczba1{/stala}. Nie jest to liczba, a łańcuch znaków (wszystko zawarte pomiędzy znakami \’ jest przez PHP traktowane jak łańcuch znaków). Tak wiec PHP dokonuje tu (w miarę możliwości) automatycznej konwersji łańcucha znaków na liczbę i dopiero po jej wykonaniu przystępuje do dodawania.
Poniższy przykład może być jeszcze bardziej zaskakujący:
Tym razem zmienna {stala}$liczba1{/stala} zawiera już łańcuch znaków nie będący liczbą, a mimo to PHP dodał do siebie liczby 12 i 8. Dzieje się tak, gdyż PHP konwertując łańcuch znaków na liczbę poszukuje w łańcuchu znaków cyfr, ignorując przy tym wszystkie początkowe białe znaki (białe znaki to znaki spacji, tabulatora lub przejścia do nowej linii – \\n). Po napotkaniu cyfr konwertuje je na liczbę, aż do napotkania pierwszego znaku nie będącego cyfrą (w powyższym przykładzie aż do spacji przed słowem Ala).
Co się jednak dzieje, jeśli w łańcuchu znaków nie zostanie odnaleziona cyfra, bądź jeśli cyfra nie została umieszczona na jego początku?
$liczba1 = \'Ala ma kota 12\';
$liczba2 = 8;
$wynik = $liczba1 + $liczba2;
echo \'Wynik: \'.$wynik;
?>
Po wykonaniu powyższego skryptu otrzymamy wynik 8. PHP nie zignorował tu jednak (jak by się mogło wydawać) zmiennej {stala}$liczba1{/stala}. Napis ten został skonwertowany do liczby o wartości 0.
Podczas konwertowania zmiennych na liczby PHP stosuje następujące kryteria:
- łańcuchy znaków konwertuje w opisany sposób,
- zmienne logiczne – wartość true zostaje skonwertowana do 1, fasle do 0,
- tablice i pozostałe typy nie mogą być konwertowane do postaci liczby (czy to całkowitej, czy tez zmiennoprzecinkowej).
Przykładowa aplikacja
Na koniec prosta aplikacja internetowa witająca nas po imieniu, które wprowadzimy do formularza. Na początek zaprojektujemy nową stronę w HTML-u:
Witaj
Stronę tę zapiszemy w pliku witaj.html. A tak będzie wyglądał nasz skrypt:
Witaj
Witaj !
Powrót
Po wypełnieniu i wysłaniu formularza jego zawartość zostanie przekazana do powyższego skryptu (zapiszemy go pod nazwą witaj.php – parametr action znacznika {html}