break i continue — kontrola pętli
🎯 Po tej lekcji przerwiesz lub pominiesz krok pętli.
Wyobraź sobie, że Kuba przegląda listę zadań. Chce pominąć te już ukończone i skupić się na pozostałych. A może szuka pierwszego wolnego terminu w kalendarzu i chce zatrzymać się, gdy go znajdzie. Do takich przypadków służą break i continue.
break — zakończ pętlę wcześniej
break natychmiast przerywa działanie pętli. PHP przeskakuje do kodu za pętlą:
<?php
declare(strict_types=1);
$liczby = [3, 7, 2, 9, 1, 5, 8];
$szukana = 9;
$znaleziono = false;
foreach ($liczby as $index => $liczba) {
if ($liczba === $szukana) {
$znaleziono = true;
echo 'Znaleziono ' . $szukana . ' na pozycji ' . $index . "\n";
break; // nie ma sensu szukać dalej
}
}
if (!$znaleziono) {
echo 'Nie znaleziono liczby ' . $szukana . "\n";
}
// wynik: Znaleziono 9 na pozycji 3
Gdy znajdziemy szukaną wartość, nie ma potrzeby sprawdzać pozostałych elementów. break oszczędza czas i czyni intencję kodu jasną.
continue — pomiń bieżącą iterację
continue nie kończy pętli — tylko pomija resztę bieżącej iteracji i przechodzi do następnej:
<?php
declare(strict_types=1);
$liczby = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
echo 'Liczby nieparzyste: ';
foreach ($liczby as $liczba) {
if ($liczba % 2 === 0) {
continue; // pomiń liczby parzyste
}
echo $liczba . ' ';
}
// wynik: Liczby nieparzyste: 1 3 5 7 9
Przykład z zadaniami
Ola ma listę zadań z informacją, czy każde zostało ukończone. Chce wyświetlić tylko te do zrobienia:
<?php
declare(strict_types=1);
$zadania = [
['nazwa' => 'Kupić mleko', 'zrobione' => true],
['nazwa' => 'Napisać raport', 'zrobione' => false],
['nazwa' => 'Zadzwonić do Kuby','zrobione' => false],
['nazwa' => 'Przeczytać ebook','zrobione' => true],
['nazwa' => 'Wysłać CV', 'zrobione' => false],
];
echo "Do zrobienia:\n";
foreach ($zadania as $zadanie) {
if ($zadanie['zrobione'] === true) {
continue; // pomiń ukończone
}
echo '[ ] ' . $zadanie['nazwa'] . "\n";
}
// wynik:
// Do zrobienia:
// [ ] Napisać raport
// [ ] Zadzwonić do Kuby
// [ ] Wysłać CV
break i continue w pętli for
Działają tak samo w każdym rodzaju pętli:
<?php
declare(strict_types=1);
// Znajdź pierwszą liczbę podzielną przez 7, większą niż 20
for ($i = 21; $i <= 100; $i++) {
if ($i % 7 !== 0) {
continue;
}
echo 'Pierwsza liczba: ' . $i;
break;
}
// wynik: Pierwsza liczba: 21
break z liczbą poziomów
Gdy masz zagnieżdżone pętle, możesz podać, ile poziomów ma przerwać break:
<?php
declare(strict_types=1);
$macierz = [
[1, 2, 3],
[4, 0, 6], // zero jest tu — chcemy to znaleźć i wyjść z obu pętli
[7, 8, 9],
];
$znaleziono = false;
foreach ($macierz as $wiersz => $kolumny) {
foreach ($kolumny as $kolumna => $wartosc) {
if ($wartosc === 0) {
echo "Zero na [$wiersz][$kolumna]\n";
$znaleziono = true;
break 2; // przerywa OBIE pętle naraz
}
}
}
// wynik: Zero na [1][1]
break i continue to przydatne narzędzia, ale zbyt wiele z nich w jednej pętli może utrudnić zrozumienie kodu. Jeśli masz kilka continue pod rząd, zastanów się, czy nie przepisać logiki z użyciem odwróconego warunku.Wzorzec „strażnik" z continue
Popularny wzorzec to użycie continue jako strażnika na początku pętli — odrzuca elementy, które nie spełniają wymagań, a reszta kodu nie jest wcięta w dodatkowy if:
<?php
declare(strict_types=1);
$zamowienia = [
['id' => 1, 'status' => 'nowe', 'kwota' => 150.0],
['id' => 2, 'status' => 'anulowane', 'kwota' => 80.0],
['id' => 3, 'status' => 'nowe', 'kwota' => 320.0],
['id' => 4, 'status' => 'wysłane', 'kwota' => 50.0],
['id' => 5, 'status' => 'nowe', 'kwota' => 200.0],
];
$sumaNowych = 0.0;
foreach ($zamowienia as $zamowienie) {
if ($zamowienie['status'] !== 'nowe') {
continue; // strażnik — pomiń wszystko poza "nowe"
}
$sumaNowych += $zamowienie['kwota'];
}
echo 'Suma nowych zamówień: ' . $sumaNowych . ' zł';
// wynik: Suma nowych zamówień: 670 zł
Teraz masz pełen zestaw narzędzi do sterowania przepływem w pętlach. Połącz foreach, break i continue — a obsłużysz każdą listę danych w elegancki sposób.
Sprawdź się
Co robi instrukcja break wewnątrz pętli?
break natychmiast kończy działanie pętli — PHP przeskakuje do kodu znajdującego się za nawiasem zamykającym pętlę.
Co robi instrukcja continue wewnątrz pętli?
continue przeskakuje resztę bieżącej iteracji. Pętla nie kończy się — PHP przechodzi do kolejnego elementu (lub sprawdza warunek w while/for).
Jaki wynik da poniższy kod? for ($i = 1; $i <= 5; $i++) { if ($i === 3) continue; echo $i . ' '; }
Gdy $i === 3, continue pomija echo i przechodzi do $i = 4. Wypisywane są wszystkie liczby oprócz 3.
Ćwiczenie
Masz tablicę zadań. Każde zadanie to tablica z kluczami 'nazwa' i 'zrobione' (true/false). Wyświetl tylko te zadania, które nie są jeszcze zrobione (zrobione === false). Użyj continue do pomijania ukończonych zadań.
Pokaż rozwiązanie
<?php
declare(strict_types=1);
$zadania = [
['nazwa' => 'Kupić mleko', 'zrobione' => true],
['nazwa' => 'Napisać raport', 'zrobione' => false],
['nazwa' => 'Zadzwonić do Oli','zrobione' => false],
['nazwa' => 'Przeczytać ebook','zrobione' => true],
['nazwa' => 'Wysłać CV', 'zrobione' => false],
];
foreach ($zadania as $zadanie) {
if ($zadanie['zrobione'] === true) {
continue;
}
echo '[ ] ' . $zadanie['nazwa'] . "\n";
}
// wynik:
// [ ] Napisać raport
// [ ] Zadzwonić do Oli
// [ ] Wysłać CV