PHP: tablice indeksowane, asocjacyjne i wielowymiarowe oraz funkcje tablicowe

INF.03 · teoria
autor: redakcja · 08.09.2026
Jak zbudować tablicę indeksowaną, asocjacyjną i wielowymiarową w PHP, jak przejść po niej pętlą foreach i które wbudowane funkcje tablicowe wracają w pytaniach: count, sort, in_array, implode i explode. Lekcja 12.4 kursu INF.03.

[ INF.03: PYTANIA Z TEGO DZIAŁU ]

Ta­bli­ca to zmien­na, która trzyma wiele war­to­ści pod jedną nazwą, każdą pod wła­snym klu­czem: nu­me­rem albo na­pi­sem. Należy do typów zło­żo­nych, więc jedna nazwa $produkty wy­star­czy na całą listę to­wa­rów, za­miast trzech osob­nych zmien­nych na trzy ceny. W części pi­sem­nej wra­ca­ją py­ta­nia o war­tość ele­men­tu o po­da­nym in­dek­sie, o to, co wy­pi­sze count, która de­fi­ni­cja jest ta­bli­cą aso­cja­cyj­ną, co pokaże print_r oraz w której ta­bli­cy cze­ka­ją dane z for­mu­la­rza. W za­da­niu prak­tycz­nym ta­bli­ca jest wszę­dzie: wiersz po­bra­ny z bazy to ta­bli­ca aso­cja­cyj­na, a dane wy­sła­ne for­mu­la­rzem cze­ka­ją w $_POST.

Ta­bli­ca in­dek­so­wa­na

Ta­bli­ca in­dek­so­wa­na to ta­bli­ca, w której klu­cza­mi są ko­lej­ne liczby cał­ko­wi­te, li­czo­ne od zera. Tworzy się ją na­wia­sa­mi kwa­dra­to­wy­mi albo star­szym za­pi­sem array(). Oba zapisy dzia­ła­ją tak samo i oba po­ja­wia­ją się w ar­ku­szach, więc trzeba roz­po­zna­wać każdy z nich.
<?php $ceny = [120, 45, 650]; $stare = array(120, 45, 650); echo $ceny[0];
Pierw­szy ele­ment ma indeks 0, więc ten kod wy­pi­su­je 120, $ceny[1] to 45, a $ceny[2] to 650. Ele­ment do­kła­da się na koniec pu­sty­mi na­wia­sa­mi kwa­dra­to­wy­mi, a war­tość pod ist­nie­ją­cym in­dek­sem zmie­nia się zwy­kłym przy­pi­sa­niem. Liczbę ele­men­tów oddaje count (POLICZ), przy czym jest to liczba ele­men­tów, a nie naj­więk­szy indeks: ostat­ni ele­ment stoi pod in­dek­sem count minus jeden.
<?php $ceny = [120, 45, 650]; $ceny[] = 25; $ceny[1] = 49; echo $ceny[1] . " " . count($ceny) . " " . $ceny[count($ceny) - 1];
49 4 25
Po ele­men­tach prze­cho­dzi się pętlą. for (DLA) nadaje się tam, gdzie po­trzeb­ny jest sam numer ele­men­tu, bo licz­nik $i bie­gnie od zera do count minus jeden. foreach (DLA KAŻDEGO) sama bierze ko­lej­ne war­to­ści i nie da się w niej po­my­lić gra­ni­cy, więc do zwy­kłe­go prze­glą­da­nia ta­bli­cy jest wy­god­niej­sza; obie opi­su­je lekcja o in­struk­cjach ste­ru­ją­cych.
<?php $ceny = [120, 45, 650]; for ($i = 0; $i < count($ceny); $i++) { echo $i . ": " . $ceny[$i] . "<br>"; }
0: 120 1: 45 2: 650
Wynik po­ka­zu­je obraz z okna prze­glą­dar­ki. W źródle strony stoi jeden wiersz, a roz­bi­ja go na trzy do­pie­ro znacz­nik <br> do­kle­ja­ny w pętli.
Pu­łap­ka: odczyt spoza za­kre­su, na przy­kład $ceny[3] z ta­bli­cy o trzech ele­men­tach, daje ostrze­że­nie Warning: Undefined array key 3 i war­tość null, a nie zero.

Ta­bli­ca aso­cja­cyj­na

Ta­bli­ca aso­cja­cyj­na (associative array, ta­bli­ca z klu­cza­mi) to ta­bli­ca, w której klu­czem jest napis wy­bra­ny przez pi­szą­ce­go, a nie ko­lej­ny numer. Klucz od­dzie­la się od war­to­ści strzał­ką =>, a odczyt wy­glą­da tak samo jak przy in­dek­sie, tylko w na­wia­sie stoi napis w cu­dzy­sło­wie. Taka ta­bli­ca opi­su­je jedną rzecz z kilku pól: pro­dukt ma nazwę, cenę i stan ma­ga­zy­no­wy.
<?php $produkt = ['nazwa' => 'Mysz', 'cena' => 45, 'sztuk' => 0]; echo $produkt['cena']; foreach ($produkt as $klucz => $wartosc) { echo "<br>" . $klucz . " = " . $wartosc; }
45 nazwa = Mysz cena = 45 sztuk = 0
Wersja foreach z dwiema zmien­ny­mi bierze osobno klucz i osobno war­tość, więc jednym przej­ściem wy­pi­su­je całą za­war­tość. Przed od­czy­tem klucza, któ­re­go może nie być, spraw­dza się isset (CZY USTAWIONE): zwraca prawdę, gdy klucz ist­nie­je i nie ma war­to­ści null. Gdy trzeba od­róż­nić klucz z war­to­ścią null od klucza nie­ist­nie­ją­ce­go, służy do tego array_key_exists. Same klucze oddaje array_keys, same war­to­ści array_values, obie jako nową ta­bli­cę in­dek­so­wa­ną.
<?php $dane = ['nazwa' => 'Mysz', 'cena' => 45]; if (isset($dane['cena'])) { echo "cena jest<br>"; } print_r(array_keys($dane));
cena jest Array ( [0] => nazwa [1] => cena )
Ta­bli­ce aso­cja­cyj­ne przy­cho­dzą do skryp­tu gotowe z dwóch stron. Wiersz po­bra­ny z bazy funk­cją mysqli_fetch_assoc ma klucze równe nazwom kolumn, więc cena z tabeli produkt czeka pod $wiersz['cena'], o czym mówi lekcja o PHP i bazie danych. Dane z for­mu­la­rza tra­fia­ją do tablic su­per­glo­bal­nych $_POST albo $_GET, gdzie klu­czem jest atry­but name pola: pole o nazwie ilosc czeka pod $_POST['ilosc']. Opi­su­je to lekcja o for­mu­la­rzach w PHP.

Ta­bli­ca wie­lo­wy­mia­ro­wa

Ta­bli­ca wie­lo­wy­mia­ro­wa to ta­bli­ca, której ele­men­ta­mi są ko­lej­ne ta­bli­ce. Lista pro­duk­tów sklepu wy­glą­da wtedy jak ta­bel­ka: każdy wiersz to jedna ta­bli­ca aso­cja­cyj­na z tymi samymi klu­cza­mi, a do po­je­dyn­cze­go pola trzeba podać dwa klucze, naj­pierw numer wier­sza, potem nazwę ko­lum­ny.
Tablica indeksowana ma klucze 0, 1 i 2, asocjacyjna klucze nazwa, cena i sztuk, a w wielowymiarowej cena drugiego produktu wynosi 45
<?php $produkty = [ ['nazwa' => 'Klawiatura', 'cena' => 120, 'sztuk' => 15], ['nazwa' => 'Mysz', 'cena' => 45, 'sztuk' => 0], ['nazwa' => 'Monitor 24', 'cena' => 650, 'sztuk' => 4], ]; echo $produkty[1]['cena'] . " " . count($produkty);
45 3
Zapis $produkty[1]['cena'] czyta się od lewej: ele­ment o in­dek­sie 1, czyli drugi wiersz, a w nim pole o kluczu cena. Wier­sze są nu­me­ro­wa­ne od zera, więc Kla­wia­tu­ra ma indeks 0, Mysz 1, a Mo­ni­tor 24 indeks 2. count($produkty) liczy same wier­sze, nie pola w nich. Takie dane wy­pi­su­je się na stronę dwiema pę­tla­mi: ze­wnętrz­na bierze wiersz i otacza go znacz­ni­ka­mi <tr>, we­wnętrz­na bierze ko­lej­ne pola wier­sza i wkłada każde w <td>.
<?php $produkty = [ ['nazwa' => 'Mysz', 'cena' => 45], ['nazwa' => 'Monitor 24', 'cena' => 650], ]; echo "<table>"; foreach ($produkty as $wiersz) { echo "<tr>"; foreach ($wiersz as $pole) { echo "<td>" . $pole . "</td>"; } echo "</tr>"; } echo "</table>";
<table><tr><td>Mysz</td><td>45</td></tr><tr><td>Monitor 24</td><td>650</td></tr></table>
Do­kład­nie taki kształt ma pętla wy­pi­su­ją­ca wynik za­py­ta­nia: za­miast ta­bli­cy wpi­sa­nej ręcz­nie stoi tam wiersz po wier­szu po­bie­ra­ny z bazy, a reszta zo­sta­je bez zmian.

Wbu­do­wa­ne funk­cje ta­bli­co­we

Funk­cja ta­bli­co­wa to gotowa funk­cja PHP, która liczy, szuka albo prze­sta­wia ele­men­ty ta­bli­cy, więc nie trzeba pisać do tego wła­snej pętli. W tabeli każdy przy­kład za­czy­na od tej samej, świe­żej ta­bli­cy $t = [3, 1, 2].
Funk­cja
Co robi
Przy­kład
Wynik
count
liczy ele­men­ty
count($t)
3
sizeof
to samo co count, druga nazwa
sizeof($t)
3
array_push
do­kła­da ele­ment na koniec
array_push($t, 9)
3, 1, 2, 9
array_pop
zdej­mu­je ostat­ni ele­ment i oddaje jego war­tość
array_pop($t)
2
array_shift
zdej­mu­je pierw­szy ele­ment i prze­nu­me­ro­wu­je resztę
array_shift($t)
3
array_unshift
wsta­wia ele­ment na po­czą­tek
array_unshift($t, 9)
9, 3, 1, 2
in_array
spraw­dza, czy war­tość jest w ta­bli­cy
in_array(1, $t)
true
array_search
oddaje klucz pierw­szej takiej war­to­ści
array_search(1, $t)
1
array_sum
sumuje war­to­ści
array_sum($t)
6
max
naj­więk­sza war­tość
max($t)
3
min
naj­mniej­sza war­tość
min($t)
1
sort
sor­tu­je ro­sną­co i nu­me­ru­je klucze od nowa
sort($t)
1, 2, 3
rsort
sor­tu­je ma­le­ją­co
rsort($t)
3, 2, 1
asort
sor­tu­je po war­to­ściach, za­cho­wu­je klucze
asort($t)
1, 2, 3 z klu­cza­mi 1, 2, 0
ksort
sor­tu­je po klu­czach
ksort($t)
3, 1, 2, bez zmiany
array_reverse
od­wra­ca ko­lej­ność
array_reverse($t)
2, 1, 3
array_merge
łączy ta­bli­ce w jedną
array_merge($t, [7])
3, 1, 2, 7
array_slice
wycina frag­ment od po­da­nej po­zy­cji
array_slice($t, 1, 2)
1, 2
implode
skleja ele­men­ty w jeden napis
implode(", ", $t)
3, 1, 2
explode
dzieli napis na ta­bli­cę
explode(";", "a;b;c")
a, b, c
array_map
wy­wo­łu­je funk­cję dla każ­de­go ele­men­tu
array_map('abs', [-4, 9])
4, 9
Funk­cje sor­tu­ją­ce pra­cu­ją na ory­gi­na­le: sort($t) prze­sta­wia ele­men­ty w samej zmien­nej i oddaje prawdę, a nie nową ta­bli­cę, więc zapis $t = sort($t) nisz­czy dane. Nazwy ksort i asort biorą się od tego, co jest klu­czem po­rząd­ku: k to klucz, a to aso­cja­cja, czyli para klucz i war­tość zo­sta­je razem.
Pu­łap­ka: sort nu­me­ru­je klucze od nowa, więc ta­bli­ca aso­cja­cyj­na po nim traci swoje klucze i zo­sta­je z in­dek­sa­mi 0, 1, 2. Klucze za­cho­wu­je asort, a według kluczy po­rząd­ku­je ksort.

Wy­pi­sy­wa­nie ta­bli­cy do kon­tro­li

Zwykły echo nie po­tra­fi wy­pi­sać ta­bli­cy: po­ka­zu­je słowo Array i do­kła­da ostrze­że­nie Warning: Array to string conversion. Do zaj­rze­nia do środka służą dwie funk­cje. print_r (WYPISZ CZYTELNIE) po­ka­zu­je klucze i war­to­ści, var_dump (ZRZUT ZMIENNEJ) do­kła­da do nich typ i dłu­gość każdej war­to­ści. Obie wy­pi­su­ją wynik w wielu wier­szach, więc na stro­nie otacza się je znacz­ni­kiem <pre>, ina­czej prze­glą­dar­ka sklei wszyst­ko w jedną linię.
<?php $produkt = ['nazwa' => 'Mysz', 'cena' => 45]; echo "<pre>"; print_r($produkt); var_dump($produkt['cena']); echo "</pre>";
Array ( [nazwa] => Mysz [cena] => 45 ) int(45)

Przy­kła­dy z wy­ni­kiem

Trzy typowe ra­chun­ki na danych ze sklepu z działu o bazach danych: ceny to Kla­wia­tu­ra 120, Mysz 45 i Mo­ni­tor 24 za 650. Pierw­szy liczy sumę i śred­nią.
<?php $ceny = [120, 45, 650]; $suma = array_sum($ceny); $srednia = $suma / count($ceny); echo "Suma: " . $suma . ", średnia: " . round($srednia, 2);
Suma: 815, średnia: 271.67
Drugi prze­cho­dzi po ta­bli­cy wie­lo­wy­mia­ro­wej i wy­pi­su­je tylko pro­duk­ty tańsze niż 100.
<?php $produkty = [ ['nazwa' => 'Klawiatura', 'cena' => 120], ['nazwa' => 'Mysz', 'cena' => 45], ['nazwa' => 'Kabel HDMI', 'cena' => 25], ]; foreach ($produkty as $p) { if ($p['cena'] < 100) { echo $p['nazwa'] . " " . $p['cena'] . " zl<br>"; } }
Mysz 45 zl Kabel HDMI 25 zl
Trzeci za­mie­nia ta­bli­cę na napis i napis na ta­bli­cę, czyli robi to, co implode i explode robią w każdą stronę.
<?php $nazwy = ['Klawiatura', 'Mysz', 'Monitor 24']; echo implode(", ", $nazwy) . "<br>"; $litery = explode(";", "a;b;c"); echo count($litery) . " " . $litery[0];
Klawiatura, Mysz, Monitor 24 3 a

Na eg­za­mi­nie

Py­ta­nia pi­sem­ne o ta­bli­ce mają kilka sta­łych kształ­tów. Pierw­szy to po­praw­na de­fi­ni­cja: ta­bli­cą aso­cja­cyj­ną jest array("a" => 1, "b" => 2), bo klucz od war­to­ści od­dzie­la strzał­ka =>, a od­po­wie­dzi ze zna­kiem rów­no­ści albo z samymi war­to­ścia­mi od­pa­da­ją. Drugi to war­tość ele­men­tu: w ramce stoi ta­bli­ca i py­ta­nie, co wy­pi­sze echo dla po­da­ne­go in­dek­su. Trzeci to count, która oddaje liczbę ele­men­tów, a nie naj­więk­szy indeks. Czwar­ty to liczba po­wtó­rzeń echo w pętli foreach: in­struk­cja wy­ko­nu­je się tyle razy, ile jest ele­men­tów, a nie raz dla całej ta­bli­cy. Piąty to wydruk print_r, w którym w na­wia­sach kwa­dra­to­wych stoją klucze, a po strzał­ce war­to­ści. Szósty to for­mu­larz: pole <input name="im"> po wy­sła­niu war­to­ści Janek daje wpis w ta­bli­cy $_POST pod in­dek­sem im, a nie od­wrot­nie. Siódmy to sor­to­wa­nie: ta­bli­cę aso­cja­cyj­ną według in­dek­sów po­rząd­ku­je ksort, według war­to­ści asort. Ósmy to in_array, które mówi tylko, czy war­tość jest w ta­bli­cy, pod­czas gdy array_search oddaje jej klucz. Dzie­wią­ty to ostrze­że­nie wi­docz­ne na stro­nie: Warning: Undefined array key znaczy próbę od­wo­ła­nia się do nie­ist­nie­ją­ce­go ele­men­tu ta­bli­cy, naj­czę­ściej odczyt z $_POST przed wy­sła­niem for­mu­la­rza. Dzie­sią­ty to nazwa pętli: ope­ra­cje na wszyst­kich ele­men­tach ta­bli­cy z au­to­ma­tycz­nym in­dek­so­wa­niem wy­ko­nu­je foreach, a nie for, while ani do...while.
Pu­łap­ka: in­dek­sy liczą się od zera, więc trzeci ele­ment ma indeks 2, a ostat­ni ele­ment ta­bli­cy, dla której count daje 4, stoi pod in­dek­sem 3.
W za­da­niu prak­tycz­nym ta­bli­ce wcho­dzą w dwóch miej­scach. Wiersz po­bra­ny z bazy funk­cją mysqli_fetch_assoc jest ta­bli­cą aso­cja­cyj­ną z klu­cza­mi rów­ny­mi nazwom kolumn, więc nazwę pro­duk­tu wy­pi­su­je $wiersz['nazwa']. Ta sama funk­cja w wersji mysqli_fetch_row oddaje ta­bli­cę in­dek­so­wa­ną, więc pierw­sza ko­lum­na z SELECT to $wiersz[0], druga $wiersz[1] i tak dalej, a mysqli_fetch_array daje oba kom­ple­ty kluczy naraz. Pętla po­bie­ra­ją­ca ko­lej­ne wier­sze wy­pi­su­je je potem według wzoru z ar­ku­sza, jako po­zy­cje <li> albo wier­sze <tr>. Drugie miej­sce to for­mu­larz wy­sła­ny metodą POST do tej samej strony: war­tość pola czyta się z $_POST i wsta­wia do klau­zu­li WHERE za­py­ta­nia, a nazwa klucza musi zga­dzać się co do znaku z atry­bu­tem name w for­mu­la­rzu HTML.

Ściąga

Zapis
Znaczy
$t = [120, 45, 650];
ta­bli­ca in­dek­so­wa­na, klucze 0, 1 i 2
$t = array(120, 45);
star­szy zapis ta­bli­cy, działa tak samo
$t[] = 25;
do­kła­da ele­ment na koniec
$t[0]
pierw­szy ele­ment ta­bli­cy
count($t) - 1
indeks ostat­nie­go ele­men­tu
$p = ['cena' => 45];
ta­bli­ca aso­cja­cyj­na, klu­czem jest napis
$p['cena']
odczyt war­to­ści po kluczu
foreach ($t as $w)
pętla po samych war­to­ściach
foreach ($p as $k => $w)
pętla po klu­czach i war­to­ściach
isset($p['cena'])
czy klucz ist­nie­je i nie jest null
$produkty[1]['cena']
pole dru­gie­go wier­sza ta­bli­cy wie­lo­wy­mia­ro­wej
in_array(45, $t)
czy war­tość jest w ta­bli­cy
array_search(45, $t)
klucz pierw­szej takiej war­to­ści
array_sum($t)
suma war­to­ści
sort($t)
sor­tu­je ro­sną­co, klucze od nowa
asort($p)
sor­tu­je po war­to­ściach, klucze zo­sta­ją
ksort($p)
sor­tu­je po klu­czach
implode(", ", $t)
ta­bli­ca na jeden napis
explode(";", $s)
napis na ta­bli­cę
print_r($t)
czy­tel­ny wydruk całej ta­bli­cy
$_POST['imie']
war­tość pola for­mu­la­rza o name="imie"
$wiersz['nazwa']
ko­lum­na wier­sza z mysqli_fetch_assoc
Pobierz ściągę PDF
ZAWODNIK
egzamin zawodowy INF.02 · INF.03 · INF.04
Serwer Discord
Egzaminy zawodowe IT/Matury/Studia
@yastor
© 2026 Zawodnik · by Yastor
Arkusze i zasady oceniania pochodzą z CKE. Serwis nie jest powiązany z Centralną Komisją Egzaminacyjną.