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]
💡 Używaj z umiarem: 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?

Co robi instrukcja continue wewnątrz pętli?

Jaki wynik da poniższy kod? for ($i = 1; $i <= 5; $i++) { if ($i === 3) continue; echo $i . ' '; }

Ć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