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, 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ę
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ą
foreachi 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?
Składnia foreach ($tablica as $klucz => $wartość) daje dostęp zarówno do klucza, jak i wartości każdego elementu tablicy asocjacyjnej.
Masz $ceny = [10, 25, 5]. Jak obliczyć ich sumę za pomocą jednej funkcji?
array_sum() oblicza sumę wszystkich wartości tablicy w jednym wywołaniu — zwraca int lub float zależnie od wartości.
Co jest wynikiem array_values(array_filter([1, 0, 2, null, 3]))?
array_filter bez callbacku usuwa wartości fałszywe (0, null), zachowując klucze 0, 2, 4. array_values() reindeksuje wynik od zera — finalnie tablica [0=>1, 1=>2, 2=>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