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 na tablicy wielowymiarowej: Użyj 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
⚠️ Głębokość zagnieżdżenia: PHP nie ogranicza liczby poziomów zagnieżdżenia — możesz mieć tablice w tablicach w tablicach. W praktyce jednak więcej niż dwa–trzy poziomy znacznie utrudniają czytelność. Jeśli struktura staje się bardzo złożona, rozważ użycie klas i obiektów.

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?

Co zwróci count($produkty), jeśli $produkty zawiera 3 tablice wewnętrzne?

Jak wyświetlić nazwę i cenę każdego produktu z tablicy wielowymiarowej $koszyk w pętli?

Ć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