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
&$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 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?
Poprawna składnia to foreach ($arr as $key => $value) — klucz jest po lewej stronie =>, wartość po prawej.
Co wypisze poniższy kod? $kolory = ['czerwony', 'zielony', 'niebieski']; foreach ($kolory as $kolor) { echo $kolor . ' '; }
foreach ($kolory as $kolor) przypisuje kolejno każdy element do $kolor i echo wypisuje go ze spacją. Klucze (indeksy) nie są tu widoczne.
Do czego służy & przed nazwą zmiennej w foreach ($arr as &$value)?
Znak & tworzy referencję — $value wskazuje bezpośrednio na element tablicy. Zmiany w $value zmieniają też oryginalną tablicę.
Ć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