Pętla foreach — po elementach listy

🎯 Po tej lekcji przejdziesz po wszystkich elementach listy.

Masz listę zakupów — jabłka, chleb, mleko. Chcesz wyświetlić każdy produkt po kolei. Możesz użyć pętli for z indeksem, ale jest czytelniejsze rozwiązanie: pętla foreach. Została stworzona właśnie do przechodzenia po elementach tablicy.

Podstawowa składnia foreach

<?php
declare(strict_types=1);

$zakupy = ['jabłka', 'chleb', 'mleko', 'ser'];

foreach ($zakupy as $produkt) {
    echo $produkt . "\n";
}
// wynik:
// jabłka
// chleb
// mleko
// ser

foreach samodzielnie pobiera kolejne elementy tablicy i przypisuje je do zmiennej $produkt. Nie musisz śledzić indeksu ani martwić się o warunek końca — pętla zatrzymuje się automatycznie po ostatnim elemencie.

Dostęp do klucza i wartości

Jeśli potrzebujesz też numeru (indeksu) elementu, rozszerz składnię o $key => $value:

<?php
declare(strict_types=1);

$zadania = ['napisz raport', 'zadzwoń do Kuby', 'wyślij e-mail'];

foreach ($zadania as $nr => $zadanie) {
    echo ($nr + 1) . '. ' . $zadanie . "\n";
}
// wynik:
// 1. napisz raport
// 2. zadzwoń do Kuby
// 3. wyślij e-mail

Indeksy w PHP zaczynają się od 0, dlatego piszemy $nr + 1, żeby wyświetlać numerację od 1.

Tablice asocjacyjne

foreach świetnie współpracuje z tablicami asocjacyjnymi, gdzie klucze to słowa, nie liczby:

<?php
declare(strict_types=1);

$ksiazka = [
    'tytul'   => 'Wiedźmin',
    'autor'   => 'Andrzej Sapkowski',
    'rok'     => 1986,
    'gatunek' => 'fantasy',
];

foreach ($ksiazka as $pole => $wartosc) {
    echo "$pole: $wartosc\n";
}
// wynik:
// tytul: Wiedźmin
// autor: Andrzej Sapkowski
// rok: 1986
// gatunek: fantasy

Lista produktów — przykład z życia

Ola ma listę produktów ze sklepu, każdy z nazwą i ceną:

<?php
declare(strict_types=1);

$produkty = [
    ['nazwa' => 'chleb',  'cena' => 3.50],
    ['nazwa' => 'masło',  'cena' => 7.99],
    ['nazwa' => 'jogurt', 'cena' => 2.49],
    ['nazwa' => 'jabłka', 'cena' => 4.20],
];

$suma = 0.0;

foreach ($produkty as $produkt) {
    echo $produkt['nazwa'] . ' — ' . $produkt['cena'] . " zł\n";
    $suma += $produkt['cena'];
}

echo 'Razem: ' . round($suma, 2) . ' zł';
// wynik:
// chleb — 3.5 zł
// masło — 7.99 zł
// jogurt — 2.49 zł
// jabłka — 4.2 zł
// Razem: 18.18 zł

Modyfikowanie elementów przez referencję

Domyślnie foreach pracuje na kopii każdego elementu — zmiany w $wartosc nie wpływają na oryginalną tablicę. Jeśli chcesz modyfikować oryginał, użyj &:

<?php
declare(strict_types=1);

$ceny = [10.0, 20.0, 30.0];

foreach ($ceny as &$cena) {
    $cena = $cena * 1.10;  // podnieś cenę o 10%
}
unset($cena);  // usuń referencję po pętli

echo implode(', ', $ceny);
// wynik: 11, 22, 33
⚠️ Pamiętaj o unset($cena): Po pętli z referencją &$cena zmienna nadal wskazuje na ostatni element tablicy. Wywołanie unset($cena) zrywa to powiązanie i zapobiega przypadkowym nadpisaniom.

Zagnieżdżone foreach

Gdy masz tablicę tablic (np. listę uczniów z ocenami), możesz zagnieżdżać pętle:

<?php
declare(strict_types=1);

$uczniowie = [
    ['imie' => 'Ola',  'oceny' => [5, 4, 5, 3]],
    ['imie' => 'Kuba', 'oceny' => [4, 4, 3, 5]],
];

foreach ($uczniowie as $uczen) {
    $srednia = array_sum($uczen['oceny']) / count($uczen['oceny']);
    echo $uczen['imie'] . ' — średnia: ' . round($srednia, 1) . "\n";
}
// wynik:
// Ola — średnia: 4.3
// Kuba — średnia: 4
💡 foreach vs for: Używaj foreach zawsze, gdy przechodzisz po tablicy — jest czytelniejszy i nie wymaga śledzenia indeksu. Pętlę for zostaw na sytuacje, gdy potrzebujesz ściśle kontrolować krok iteracji (np. co drugi element, od końca).

W następnej lekcji dowiesz się, jak przerwać pętlę wcześniej (break) lub pominąć konkretny krok (continue).

Sprawdź się

Jaka jest poprawna składnia foreach dla tablicy asocjacyjnej, gdzie chcesz mieć dostęp zarówno do klucza, jak i wartości?

Co wypisze poniższy kod? $kolory = ['czerwony', 'zielony', 'niebieski']; foreach ($kolory as $kolor) { echo $kolor . ' '; }

Do czego służy & przed nazwą zmiennej w foreach ($arr as &$value)?

Ćwiczenie

Masz tablicę książek: ['Wiedźmin', 'Dune', 'Hobbit', '1984']. Wyświetl każdą książkę z jej numerem, zaczynając od 1. Każda pozycja w osobnej linii, np. '1. Wiedźmin'.

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

$ksiazki = ['Wiedźmin', 'Dune', 'Hobbit', '1984'];

foreach ($ksiazki as $index => $tytul) {
    echo ($index + 1) . '. ' . $tytul . "\n";
}
// wynik:
// 1. Wiedźmin
// 2. Dune
// 3. Hobbit
// 4. 1984