Tablice wielowymiarowe
🎯 Po tej lekcji stworzysz tablicę wielowymiarową, uzyskasz dostęp do zagnieżdżonych danych i przejdziesz przez nią pętlą foreach.
W prawdziwych programach dane rzadko są prostą listą identycznych wartości. Koszyk zakupów to lista produktów — a każdy produkt ma nazwę, cenę i ilość. Lista uczniów to osoby — a każda osoba ma imię, klasę i oceny. PHP radzi sobie z tym dzięki tablicom wielowymiarowym: tablicom, których elementy same są tablicami.
Tablica tablic
Najczęstszy wzorzec to tablica indeksowana, której każdy element jest tablicą asocjacyjną:
<?php
declare(strict_types=1);
$produkty = [
['nazwa' => 'Jabłka 1 kg', 'cena' => 3.99, 'ilosc' => 2],
['nazwa' => 'Chleb razowy', 'cena' => 4.49, 'ilosc' => 1],
['nazwa' => 'Mleko 1 l', 'cena' => 2.99, 'ilosc' => 3],
];
Zewnętrzna tablica przechowuje listę (indeksy 0, 1, 2), każdy element to oddzielna tablica asocjacyjna opisująca jeden produkt.
Dostęp do zagnieżdżonych danych
Żeby odczytać konkretne pole, łączysz dwa nawiasy kwadratowe: najpierw indeks zewnętrzny, potem klucz wewnętrzny:
<?php
declare(strict_types=1);
$produkty = [
['nazwa' => 'Jabłka 1 kg', 'cena' => 3.99, 'ilosc' => 2],
['nazwa' => 'Chleb razowy', 'cena' => 4.49, 'ilosc' => 1],
['nazwa' => 'Mleko 1 l', 'cena' => 2.99, 'ilosc' => 3],
];
echo $produkty[0]['nazwa']; // wynik: Jabłka 1 kg
echo $produkty[0]['cena']; // wynik: 3.99
echo $produkty[2]['ilosc']; // wynik: 3
Odczyt $produkty[0]['nazwa'] czyta się jako: „z tablicy $produkty weź element o indeksie 0, a z niego wartość pod kluczem 'nazwa'".
Iteracja — foreach w foreach
Żeby przetworzyć wszystkie produkty, używasz pętli foreach. Pętlę foreach poznałeś w lekcji Pętla foreach — tu zobaczysz ją w akcji z danymi wielopoziomowymi:
<?php
declare(strict_types=1);
$produkty = [
['nazwa' => 'Jabłka 1 kg', 'cena' => 3.99, 'ilosc' => 2],
['nazwa' => 'Chleb razowy', 'cena' => 4.49, 'ilosc' => 1],
['nazwa' => 'Mleko 1 l', 'cena' => 2.99, 'ilosc' => 3],
];
foreach ($produkty as $produkt) {
echo $produkt['nazwa'] . ': ' . $produkt['cena'] . ' zł (szt. ' . $produkt['ilosc'] . ')';
echo "\n";
}
// wynik:
// Jabłka 1 kg: 3.99 zł (szt. 2)
// Chleb razowy: 4.49 zł (szt. 1)
// Mleko 1 l: 2.99 zł (szt. 3)
W każdej iteracji $produkt to jedna z wewnętrznych tablic asocjacyjnych — możesz odczytywać jej pola za pomocą kluczy.
Zliczanie elementów
count na tablicy wielowymiarowej zlicza tylko elementy pierwszego poziomu — czyli liczbę wpisów, nie łączną liczbę pól:
<?php
declare(strict_types=1);
$produkty = [
['nazwa' => 'Jabłka 1 kg', 'cena' => 3.99],
['nazwa' => 'Chleb razowy', 'cena' => 4.49],
['nazwa' => 'Mleko 1 l', 'cena' => 2.99],
];
echo count($produkty); // wynik: 3 (trzy produkty, nie sześć pól)
print_r, żeby zobaczyć całą strukturę — PHP wyświetli ją z wcięciami, co ułatwia debugowanie zagnieżdżonych danych.Modyfikowanie zagnieżdżonych wartości
Możesz też zmieniać wartości wewnątrz tablicy wielowymiarowej:
<?php
declare(strict_types=1);
$koszyk = [
['nazwa' => 'Jabłka 1 kg', 'cena' => 3.99, 'ilosc' => 2],
['nazwa' => 'Chleb razowy', 'cena' => 4.49, 'ilosc' => 1],
];
// Zmień ilość pierwszego produktu:
$koszyk[0]['ilosc'] = 4;
// Dodaj nowy produkt:
$koszyk[] = ['nazwa' => 'Masło', 'cena' => 5.99, 'ilosc' => 1];
echo count($koszyk); // wynik: 3
W kolejnych lekcjach poznasz funkcje, które znacznie ułatwiają pracę z tablicami — sortowanie, filtrowanie i przekształcanie danych w kilku linijkach kodu.
Sprawdź się
Jak uzyskać dostęp do pola 'nazwa' pierwszego produktu z tablicy $produkty?
Indeksy w PHP zaczynają się od 0, więc pierwszy element to $produkty[0]. Dostęp do pola tablicy asocjacyjnej wymaga nawiasów kwadratowych: $produkty[0]['nazwa'].
Co zwróci count($produkty), jeśli $produkty zawiera 3 tablice wewnętrzne?
count() domyślnie (COUNT_NORMAL) liczy tylko elementy pierwszego poziomu — czyli liczbę tablic wewnętrznych, nie ich zawartości. Dla $produkty z 3 wpisami zwróci 3.
Jak wyświetlić nazwę i cenę każdego produktu z tablicy wielowymiarowej $koszyk w pętli?
foreach ($koszyk as $produkt) iteruje po wszystkich tablicach wewnętrznych. W każdej iteracji $produkt to jedna tablica asocjacyjna, więc $produkt['nazwa'] i $produkt['cena'] dają dostęp do jej pól.
Ćwiczenie
Stwórz tablicę $uczniowie zawierającą co najmniej 3 uczniów. Każdy uczeń to tablica asocjacyjna z polami: 'imie', 'klasa', 'srednia' (liczba float). Wyświetl każdego ucznia w formacie: 'Anna (klasa 3B): średnia 4.75'. Użyj pętli foreach.
Pokaż rozwiązanie
<?php
declare(strict_types=1);
$uczniowie = [
['imie' => 'Anna', 'klasa' => '3B', 'srednia' => 4.75],
['imie' => 'Bartek', 'klasa' => '2A', 'srednia' => 3.50],
['imie' => 'Kasia', 'klasa' => '3B', 'srednia' => 5.00],
];
foreach ($uczniowie as $uczen) {
echo $uczen['imie'] . ' (klasa ' . $uczen['klasa'] . '): średnia ' . $uczen['srednia'] . "\n";
}
// wynik:
// Anna (klasa 3B): średnia 4.75
// Bartek (klasa 2A): średnia 3.5
// Kasia (klasa 3B): średnia 5