Praca z tablicami — praktyka

🎯 Po tej lekcji samodzielnie zestawisz dane w tablicy wielowymiarowej, przejdziesz przez nią pętlą i obliczysz podsumowania za pomocą funkcji tablicowych.

Teraz, gdy znasz tablice i funkcje tablicowe, pora złożyć wszystko razem. Ta lekcja to czysta praktyka — zbudujesz koszyk zakupów, przefiltrujesz listę zadań i obliczysz podsumowania. To właśnie takich rzeczy będziesz używać na co dzień w prawdziwych projektach PHP.

Iteracja po tablicy asocjacyjnej

Pętlę foreach poznałeś w lekcji Pętla foreach. Przypomnijmy jej składnię dla tablic asocjacyjnych:

<?php
declare(strict_types=1);

$produkt = [
    'nazwa'    => 'Kawa ziarnista',
    'cena'     => 24.99,
    'dostepny' => true,
];

foreach ($produkt as $klucz => $wartosc) {
    echo $klucz . ': ' . $wartosc . "\n";
}
// wynik:
// nazwa: Kawa ziarnista
// cena: 24.99
// dostepny: 1

Iteracja po tablicy wielowymiarowej

Gdy każdy element to tablica asocjacyjna, foreach pobiera jedną wewnętrzną tablicę przy każdej iteracji:

<?php
declare(strict_types=1);

$menu = [
    ['danie' => 'Zupa pomidorowa', 'cena' => 12.00],
    ['danie' => 'Kotlet schabowy', 'cena' => 28.50],
    ['danie' => 'Szarlotka',       'cena' => 9.00],
];

foreach ($menu as $pozycja) {
    echo $pozycja['danie'] . ' — ' . $pozycja['cena'] . " zł\n";
}
// wynik:
// Zupa pomidorowa — 12 zł
// Kotlet schabowy — 28.5 zł
// Szarlotka — 9 zł

Budowanie koszyka zakupów

Oto krok po kroku — koszyk z obliczaniem wartości każdej pozycji i łącznej sumy:

<?php
declare(strict_types=1);

$koszyk = [
    ['nazwa' => 'Jabłka 1 kg',  'cena' => 3.99, 'ilosc' => 3],
    ['nazwa' => 'Chleb razowy', 'cena' => 4.49, 'ilosc' => 2],
    ['nazwa' => 'Ser żółty',    'cena' => 9.99, 'ilosc' => 1],
];

// Wyświetl każdą pozycję:
foreach ($koszyk as $produkt) {
    $wartosc = round($produkt['cena'] * $produkt['ilosc'], 2);
    echo $produkt['ilosc'] . 'x ' . $produkt['nazwa'];
    echo ' = ' . $wartosc . " zł\n";
}
// wynik:
// 3x Jabłka 1 kg = 11.97 zł
// 2x Chleb razowy = 8.98 zł
// 1x Ser żółty = 9.99 zł

Teraz użyj array_map i array_sum, żeby policzyć łączną sumę:

<?php
declare(strict_types=1);

$koszyk = [
    ['nazwa' => 'Jabłka 1 kg',  'cena' => 3.99, 'ilosc' => 3],
    ['nazwa' => 'Chleb razowy', 'cena' => 4.49, 'ilosc' => 2],
    ['nazwa' => 'Ser żółty',    'cena' => 9.99, 'ilosc' => 1],
];

// Wyciągnij wartości (cena × ilość) dla każdej pozycji:
$wartosci = array_map(
    fn($p) => $p['cena'] * $p['ilosc'],
    $koszyk
);

$suma = round(array_sum($wartosci), 2);
echo 'Razem do zapłaty: ' . $suma . ' zł';
// wynik: Razem do zapłaty: 30.94 zł
💡 array_map + array_sum to częsty duet: Wyciągasz jedną wartość z każdego elementu przez array_map, a potem sumujesz wyniki przez array_sum. Ten wzorzec pojawia się wszędzie — koszyki, faktury, rankingi.

Filtrowanie listy zadań

Stwórzmy prostą listę zadań z polem zrobione i przefiltrujmy ją:

<?php
declare(strict_types=1);

$zadania = [
    ['tekst' => 'Kup mleko',         'zrobione' => true],
    ['tekst' => 'Zadzwoń do Kuby',   'zrobione' => false],
    ['tekst' => 'Napisz raport',      'zrobione' => false],
    ['tekst' => 'Wyślij e-mail',      'zrobione' => true],
    ['tekst' => 'Umów wizytę',        'zrobione' => false],
];

// Zadania do zrobienia:
$doZrobienia = array_filter($zadania, fn($z) => !$z['zrobione']);

echo 'Do zrobienia: ' . count($doZrobienia) . ' z ' . count($zadania) . "\n";
// wynik: Do zrobienia: 3 z 5

foreach ($doZrobienia as $zadanie) {
    echo '[ ] ' . $zadanie['tekst'] . "\n";
}
// wynik:
// [ ] Zadzwoń do Kuby
// [ ] Napisz raport
// [ ] Umów wizytę
⚠️ Klucze po array_filter: Zauważ, że array_filter zachowuje oryginalne klucze (1, 2, 4 — bo zadania o indeksach 0 i 3 były zrobione). Jeśli potrzebujesz ciągłych kluczy 0, 1, 2..., użyj array_values($doZrobienia).

Sprawdzanie, czy produkt jest w ofercie

Łącząc in_array z danymi wielowymiarowymi, możesz sprawdzić obecność wartości. Najpierw wyciągnij listę nazw przez array_map, a potem sprawdź:

<?php
declare(strict_types=1);

$oferta = [
    ['nazwa' => 'Jabłka', 'cena' => 3.99],
    ['nazwa' => 'Gruszki', 'cena' => 5.49],
    ['nazwa' => 'Śliwki',  'cena' => 4.99],
];

$nazwy = array_map(fn($p) => $p['nazwa'], $oferta);
// $nazwy = ['Jabłka', 'Gruszki', 'Śliwki']

var_dump(in_array('Gruszki', $nazwy, true)); // wynik: bool(true)
var_dump(in_array('Banany', $nazwy, true));  // wynik: bool(false)

Podsumowanie modułu

W tym module nauczyłeś się:

  • Tworzyć tablice indeksowane ([...], indeksy od 0, $a[] = ...)
  • Tworzyć tablice asocjacyjne (klucz => wartość, dostęp po kluczu)
  • Budować tablice wielowymiarowe (listy produktów, koszyki, zestawienia)
  • Używać kluczowych funkcji tablicowych: count, in_array, array_map, array_filter, sort, array_sum
  • Iterować po tablicach za pomocą foreach i budować podsumowania

Tablice to fundament większości aplikacji PHP — spotkasz je wszędzie: w formularzach, bazach danych, API i szablonach HTML. Teraz masz narzędzia, żeby nimi sprawnie zarządzać.

Funkcje w tej lekcji

Sprawdź się

Jak w pętli foreach uzyskać jednocześnie klucz i wartość tablicy asocjacyjnej?

Masz $ceny = [10, 25, 5]. Jak obliczyć ich sumę za pomocą jednej funkcji?

Co jest wynikiem array_values(array_filter([1, 0, 2, null, 3]))?

Ćwiczenie

Stwórz tablicę $koszyk z co najmniej 4 produktami. Każdy produkt to tablica asocjacyjna z polami 'nazwa' (string), 'cena' (float) i 'ilosc' (int). Następnie: (1) wyświetl każdy produkt w formacie '2x Jabłka — 7.98 zł' (ilość razy cena), (2) oblicz i wyświetl łączną wartość koszyka, (3) wyświetl tylko produkty, których jednostkowa cena przekracza 5 zł, (4) wyświetl ile pozycji jest w koszyku.

Pokaż rozwiązanie
<?php
declare(strict_types=1);

$koszyk = [
    ['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],
    ['nazwa' => 'Ser żółty',    'cena' => 9.99, 'ilosc' => 1],
];

// 1. Wyświetl każdy produkt:
foreach ($koszyk as $produkt) {
    $wartosc = round($produkt['cena'] * $produkt['ilosc'], 2);
    echo $produkt['ilosc'] . 'x ' . $produkt['nazwa'] . ' — ' . $wartosc . " zł\n";
}
// wynik:
// 2x Jabłka 1 kg — 7.98 zł
// 1x Chleb razowy — 4.49 zł
// 3x Mleko 1 l — 8.97 zł
// 1x Ser żółty — 9.99 zł

// 2. Łączna wartość:
$wartosci = array_map(fn($p) => $p['cena'] * $p['ilosc'], $koszyk);
$suma = round(array_sum($wartosci), 2);
echo 'Razem: ' . $suma . " zł\n";
// wynik: Razem: 31.43 zł

// 3. Produkty droższe niż 5 zł:
$drogie = array_filter($koszyk, fn($p) => $p['cena'] > 5.00);
foreach ($drogie as $produkt) {
    echo $produkt['nazwa'] . "\n";
}
// wynik: Ser żółty

// 4. Liczba pozycji:
echo 'Pozycji w koszyku: ' . count($koszyk);
// wynik: Pozycji w koszyku: 4