Menu

Pętla while i do while w PHP: składnia i przykłady

while (condition) { ... } powtarza blok, dopóki warunek jest prawdziwy, i sprawdza go przed każdym przebiegiem. do { ... } while (condition); sprawdza po, więc zawsze wykonuje się co najmniej raz. Strona opisuje while (true) z break, czytanie pliku linia po linii i unikanie pętli nieskończonych.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

while (condition) { ... } wykonuje blok raz za razem, dopóki warunek jest prawdziwy. Warunek jest sprawdzany przed każdym przebiegiem, więc jeśli od początku jest fałszywy, treść nie wykona się ani razu. Coś wewnątrz pętli musi zmieniać warunek, inaczej pętla się nie skończy.

To typowe pytanie dla while: nie znasz z góry liczby przebiegów, wiesz tylko, kiedy przestać. Zmień oprocentowanie i uruchom ponownie.

do while: co najmniej jeden przebieg

do { ... } while (condition); sprawdza warunek po treści, więc treść zawsze wykonuje się raz. Zwróć uwagę na średnik na końcu.

Typowe zastosowanie to „spróbuj, potem sprawdź”: rzucaj kostką, aż wypadnie szóstka, generuj kod, aż będzie nieużywany. Pierwsza próba musi nastąpić, zanim jest co sprawdzać. Ten przykład daje inny wynik przy każdym uruchomieniu:

while (true) z break

Gdy warunek wyjścia łatwiej sprawdzić w środku treści, napisz while (true) i wyjdź przez break. continue przechodzi do następnego sprawdzenia, jak w każdej pętli.

array_shift() zwraca null, gdy tablica jest pusta, i to jest drugie wyjście. Tę samą pętlę można zapisać jako while ($queue), bo pusta tablica liczy się jako fałsz.

Czytanie pliku linia po linii

fgets() zwraca po jednej linii, a na końcu pliku false, więc może bezpośrednio sterować pętlą while. Blok najpierw zapisuje plik, a potem go odczytuje.

Nawiasy wokół $line = fgets($handle) mają znaczenie: najpierw odbywa się przypisanie, potem wynik jest porównywany z false. Użycie !== false zamiast zwykłego sprawdzenia prawdziwości sprawia, że ostatnia linia zawierająca samo 0 (bez znaku nowej linii po nim) nie kończy pętli przedwcześnie. Funkcje plikowe opisuje strona o fopen().

while z endwhile w szablonach

Podobnie jak if i for, while ma formę z dwukropkiem dla HTML: while (...): i endwhile;. Ten przykład wypisuje w zakładce Page listę odliczania.

Częsty błąd: pętla, która się nie kończy

Licznik musi zbliżać się do wyjścia. Zapomnij o $i++ albo zmień niewłaściwą zmienną, a warunek pozostanie prawdziwy na zawsze. Na serwerze WWW PHP zatrzymuje skrypt po max_execution_time (domyślnie 30 sekund) z błędem krytycznym. W wierszu poleceń nie zatrzymuje się nigdy.

// Never ends: $i is never changed
$i = 0;
while ($i < 3) {
    echo $i;
}

Limit bezpieczeństwa to tania ochrona dla pętli zależnych od danych z zewnątrz, takich jak ponawianie wywołania albo stronicowanie wyników:

Uruchom to kilka razy: czasem kończy się sukcesem wcześnie, czasem się poddaje, ale zawsze się kończy. Gdy liczbę przebiegów znasz z góry, pętla for podaje początek, koniec i krok w jednej linii i trudniej w niej o pomyłkę.

Najczęściej zadawane pytania

Czym różni się while od do while w PHP?

while sprawdza warunek przed każdym przebiegiem, więc treść może nie wykonać się ani razu. do { ... } while ($cond); sprawdza po każdym przebiegu, więc treść zawsze wykonuje się co najmniej raz. Zwróć uwagę na średnik po warunku do while.

Jak zatrzymać nieskończoną pętlę while w PHP?

Wewnątrz pętli zakończ ją przez break, gdy spełniony jest warunek wyjścia: while (true) { ...; if ($done) { break; } }. Jeśli pętla nie ma break, a jej warunek nigdy nie staje się fałszywy, skrypt działa, dopóki nie zatrzyma go max_execution_time (żądania WWW), albo w nieskończoność (wiersz poleceń).

Kiedy używać while zamiast for w PHP?

Używaj while, gdy nie wiesz, ilu przebiegów potrzebujesz: czytanie do końca pliku, ponawianie aż do skutku, przetwarzanie kolejki, aż będzie pusta. Używaj for, gdy liczysz, a foreach, aby odwiedzić każdy element tablicy.

Czy PHP ma pętlę do until?

Nie. Zaneguj warunek zatrzymania w do while: do { $n++; } while (!($n >= 3)); działa, aż $n >= 3 będzie prawdą. until nie jest słowem kluczowym PHP.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ