Tablice
Ostatnia modyfikacja: 25.03.2022
Poznałeś już zmienne i rozumiesz (mam nadzieję) ich zastosowanie. Wyobraź sobie teraz, że potrzebujesz zapisać imiona pięciu osób (na przykład uczestników wycieczki). Co musiałbyś zrobić? Stworzyć 5 zmiennych zawierających takie imiona:
<?php
$person1 = 'Jan';
$person2 = 'Piotr';
$person3 = 'Adrian';
$person4 = 'Marek';
$person5 = 'Adam';
Nie byłoby to ani zbyt wygodne, ani tym bardziej czytelne. Dlatego też powstały tablice (array), które można nazwać zbiorem danych. Podobnie jak wszystkie inne wartości, możemy je przypisać do zmiennych. Elementy tablicy definiujemy w nawiasach kwadratowych, oddzielając je przecinkiem. Co ważne, elementy w tablicy mogą być różnego typu.
<?php
$people = ['Jan', 'Piotr', 'Adrian', 'Marek', 'Adam'];
Dla czytelności każdy element można zapisywać w nowej linii.
<?php
$people = [
'Jan',
'Piotr',
'Adrian',
'Marek',
'Adam'
];
Spotykany jest też zapis z array()
zamiast nawiasów kwadratowych, jest on po prostu starszy:
<?php
$people = array('Jan', 'Piotr', 'Adrian', 'Marek', 'Adam');
Każdy z elementów w tablicy ma swój kolejny automatycznie nadawany numer - indeks. Możemy dzięki niemu uzyskać dostęp do konkretnego elementu w tablicy.
Uwaga
Indeksy liczymy od zera! Jeśli więc Twoja tablica składa się z 5 elementów, to otrzymają one indeksy od 0 do 4. Próba odwołania do piątego indeksu zakończy się niepowodzeniem i wyświetleniem stosownego ostrzeżenia.
Jeśli należysz do osób ciekawskich, to być może spróbowałeś już wyświetlić sobie taką tablicę i otrzymałeś niezbyt oczekiwany efekt - napis Array z ostrzeżeniem „Array to string conversion”. echo nie potrafi wyświetlać całych tablic, nie możemy tablicy traktować jako zwykły tekst, ciąg znaków. Prawdę mówiąc, raczej nie wyświetla się od tak całych tablic (przeważnie każdą wartość się jakoś „obrabia”, najczęściej przy użyciu pętli, które niedługo poznamy), chyba że w celu testowego sprawdzenia co ona zawiera. Do tego celu możesz użyć omówionego wcześniej var_dump() czy print_r().
<?php
$people = ['Jan', 'Piotr', 'Adrian', 'Marek', 'Adam'];
var_dump($people);
Efekt:
array(5) {
[0]=>
string(3) "Jan"
[1]=>
string(5) "Piotr"
[2]=>
string(6) "Adrian"
[3]=>
string(5) "Marek"
[4]=>
string(4) "Adam"
}
Bez problemu za to wyświetlimy jeden element o konkretnym indeksie. Należy wskazać go w nawiasach kwadratowych, na zmiennej z tablicą:
<?php
$people = ['Jan', 'Piotr', 'Adrian', 'Marek', 'Adam'];
echo $people[1]; // result: Piotr
echo $people[4]; // result: Adam
Podobnym sposobem można nadpisać wartość danego elementu:
<?php
$people = ['Jan', 'Piotr', 'Adrian', 'Marek', 'Adam'];
echo $people[2]; // result: Adrian
$people[2] = 'Andrzej';
echo $people[2]; // result: Andrzej
Możemy jeszcze narzucić własną numerację indeksów podczas tworzenia. Poniższy zapis spowoduje, że numeracja rozpocznie się od 2 (kolejne elementy dostaną kolejne numery).
<?php
$people = [2 => 'Jan', 'Piotr', 'Adrian', 'Marek', 'Adam'];
W taki sam sposób możemy też nadać każdemu indeksowi inny numer (i nie muszą to być kolejne liczby).
<?php
$people = [
3 => 'Jan',
7 => 'Piotr',
5 => 'Adrian',
0 => 'Marek',
2 => 'Adam'
];
A co, jeśli po stworzeniu tablicy będziemy chcieli dodać do niej kolejny element? Nie ma problemu:
<?php
$people = ['Jan', 'Piotr', 'Adrian', 'Marek', 'Adam'];
$people[] = 'Arkadiusz';
W tym przypadku dostanie on automatycznie kolejny numer. Rzecz jasna istnieje możliwość podania w nawiasach konkretnego indeksu do stworzenia.
<?php
$people = ['Jan', 'Piotr', 'Adrian', 'Marek', 'Adam'];
$people[7] = 'Arkadiusz';
Klucz tekstowy
A teraz wyobraź sobie, że potrzebujesz zapisać dane każdego uczestnika wycieczki (dla przykładu: wiek, adres i e-mail). Tworzenie tylu zmiennych, jak już wiesz, byłoby słabym sposobem. Użyjemy tablicy, jednak posługiwanie się cyferkami, aby dostać się do danej wartości, również wydaje się problematyczne. Trzeba pamiętać numerek, a co będzie, jak zabraknie którejś danej? Numeracja indeksów się przesunie i możemy odczytać niewłaściwe dane…
Z pomocą przychodzą nam właśnie klucze tekstowe, dzięki którym możemy dowolnie nazwać każdy element. Powstanie z tego tablica asocjacyjna. Zdefiniujmy przykładową:
<?php
$person = [
'name' => 'Jan',
'age' => 26,
'address' => 'Kwiatowa 1',
'email' => 'jan@example.com'
];
Warto dodać, że jedna tablica może zawierać klucze różnego typu - zarówno liczbowe (int), jak i tekstowe (string).
<?php
$person = [
'name' => 'Jan',
4 => 26,
null => 'Kwiatowa 1',
2.8 => 'jan@example.com'
];
var_dump($person);
array(4) {
["name"]=>
string(3) "Jan"
[4]=>
int(26)
[""]=>
string(10) "Kwiatowa 1"
[2]=>
string(15) "jan@example.com"
}
Podobnie, jak w przypadku liczbowych indeksów, możemy odwołać się do danego elementu:
<?php
echo $person['address']; // result: Kwiatowa 1
Albo dodawać nowe elementy:
<?php
$person['surname'] = 'Kowalski';
echo $person['name'] . ' ' . $person['surname']; // result: Jan Kowalski
Zagnieżdżanie tablic
Możemy także bez problemu stworzyć tablicę wewnątrz innej tablicy, czyli zagnieździć je. Każda tablica może mieć swoje klucze i inne elementy.
<?php
$people = [
'Jan' => [
'age' => 26,
'address' => 'Kwiatowa 1',
'email' => 'jan@example.com'
],
'Piotr' => [
'age' => 32,
'address' => 'Ogrodowa 8',
'email' => 'piotr@example.com'
]
];
echo $people['Piotr']['age']; // result: 32
Na razie na tym poprzestaniemy. Podstawy tablic w tym momencie poznałeś, jednak istnieje jeszcze bardzo dużo funkcji do operacji na nich, o których warto byłoby powiedzieć. Zrobimy to później, w osobnej części kursu.
„Rozpakowanie” elementów php >=7.4
Dzięki konstrukcji ...
(tak, to są trzy kropki) możemy tak jakby wypakować elementy z tablicy. Tablica jest rozbijana i każdy element staje się osobnym bytem. Najprościej pokazać to na krótkim przykładzie:
<?php
var_dump(...['Jan', 'Piotr', 'Marek']);
string(3) "Jan"
string(5) "Piotr"
string(5) "Marek"
Przemieniliśmy tablicę w osobne ciągi. Poznając kolejne elementy języka, zauważysz konkretne opcje użycia takiego zapisu. W tym momencie mogę pokazać np., że możemy dzięki temu rozpakować tablicę wewnątrz innej, aby dodać jej elementy.
<?php
$oldPeople = ['Jan', 'Piotr'];
$people = ['Arkadiusz', ...$oldPeople, 'Marek'];
var_dump($people);
array(4) {
[0]=>
string(9) "Arkadiusz"
[1]=>
string(3) "Jan"
[2]=>
string(5) "Piotr"
[3]=>
string(5) "Marek"
}
Oczywiście zapis ['Arkadiusz', $oldPeople, 'Marek']
nie zadziałałby tak samo - zamiast dodać pojedyncze imiona, wstawilibyśmy całą tablicę $oldPeople
jako jeden element.
Warto dodać, że od php >=8.1 rozpakowywać możemy także tablice asocjacyjne. We wcześniejszych wersjach możliwe to było tylko dla tablic z indeksami liczbowymi.
Komentarze