3 linie. Ten sam wynik w przeglądarce. Jedna poprawka zmienia wszystkie wiersze.
Pętla to powtarzanie tego samego fragmentu kodu, dopóki jest coś do zrobienia. PHP ma cztery: for (gdy wiecie, ile razy), while (dopóki warunek jest prawdziwy), do…while (jak while, ale sprawdza na końcu) i foreach (dla każdego elementu tablicy, na następnej lekcji).
Ciekawostka z PHP Manual: instrukcja break przyjmuje opcjonalną liczbę, która mówi, z ilu zagnieżdżonych pętli naraz wyjść, na przykład break 2; kończy dwie pętle jednocześnie. Bez tej liczby break domyślnie kończy tylko najbliższą, otaczającą pętlę.
PHP Manual: for · php.net/manual/en/control-structures.for.php · ciekawostka: PHP Manual, break („break accepts an optional numeric argument which tells it how many nested enclosing structures are to be broken out of. The default value is 1...”) · php.net/manual/en/control-structures.break.php
Trzy części w nawiasie oddzielacie średnikami. Zmienna $lap to licznik: liczy okrążenia jak sędzia na bieżni.
PHP Manual: for („expr1 is evaluated once unconditionally at the beginning… expr2 at the beginning of each iteration… expr3 at the end of each iteration”) · php.net/manual/en/control-structures.for.php
Mieszacie zupę, dopóki nie zgęstnieje: przed każdym ruchem łyżką sprawdzacie gęstość. Warunek fałszywy na starcie = pętla nie wykona się ani razu.
do { … } while (warunek); sprawdza warunek na końcu, więc ciało wykona się co najmniej raz: $i = 0; do { echo $i; } while ($i > 0); wypisze 0. Rzadko potrzebne.
PHP Manual: while („If the while expression evaluates to false from the very beginning, the nested statement(s) won't even be run once”) · php.net/manual/en/control-structures.while.php · do-while · php.net/manual/en/control-structures.do.while.php
Część 4 · break i continue
Pętla nieskończona, break i continue
$power = 1;
while (true) { // zawsze prawda$power *= 2;
if ($power > 100) {
break; // wyjdź z pętli
}
}
echo$power; // 128: pierwsza potęga większa od 100
break to wyjście awaryjne: kończy pętlę natychmiast, choć warunek dalej jest prawdziwy.
continue pomija resztę tego powtórzenia i skacze do następnego. Pętla trwa dalej.
Pętla bez break i bez zmiany licznika kręci się w nieskończoność: strona „ładuje się”, po 30 s PHP przerywa skrypt błędem. Najczęstsza przyczyna: zapomniane $i++ w while.
PHP Manual: break („ends execution of the current for, foreach, while, do-while or switch structure”) · php.net/manual/en/control-structures.break.php · continue · php.net/manual/en/control-structures.continue.php · limit 30 s: max_execution_time · php.net/manual/en/info.configuration.php
Zewnętrzna pętla robi wiersz, wewnętrzna wypełnia go komórkami. Na każdy z 10 wierszy wewnętrzna wykonuje się 10 razy: razem 100 komórek.
PHP Manual: for (pętle można zagnieżdżać jak każdą instrukcję) · php.net/manual/en/control-structures.for.php · MDN Web Docs: HTML table basics (table, tr, td, th) · developer.mozilla.org/en-US/docs/Learn_web_development/Core/Structuring_content/HTML_table_basics
Egzamin INF.03
Tak pytają na egzaminie
1.for($i = 0; $i < 25; $i += 5) { … }
Ile iteracji zrealizuje przedstawiona pętla zapisana w języku PHP?
0
5
25
26
2.$i= 20; $a=0; while($i) { $a += 2; $i--; }
Które wartości będą przechowywane w zmiennych po wykonaniu przedstawionej pętli języka PHP?
a = 40, i = 0
a = 0, i = 20
a = 20, i = 20
a = 40, i = 20
„Iteracja” to jedno powtórzenie pętli. W zadaniu 2 while($i) znaczy „dopóki $i nie jest zerem”: liczba różna od 0 liczy się jako prawda.
W swoim folderze htdocs utwórz plik multiplication-table.php ze szkieletem strony HTML. W <head> dodaj styl: td, th { border: 1px solid #999; padding: 4px; }.
W <body> wypisz z PHP tabelę 10×10 jak ze slajdu, ale z nagłówkami: pierwszy wiersz to <th> z liczbami 1 do 10 (osobna pętla przed główną), a każdy wiersz zaczyna się od <th>$row</th>.
Pod tabelą: pętla while wypisująca potęgi dwójki (1, 2, 4, 8…), po jednej w linii, dopóki liczba nie przekroczy 1000. Zacznij od $power = 1;, warunek while ($power <= 1000), w środku NAJPIERW echo, POTEM $power *= 2;.
Otwórz localhost/multiplication-table.php i sprawdź wynik.
Ma się pojawić: tabela z ramkami, lewy górny róg pusty, w prawym dolnym 100. Pod nią 10 linii: od 1 do 512 (1024 już nie, bo przekracza 1000).
Dla szybkich: pokoloruj co drugi wiersz tabliczki (podpowiedź: $row % 2 i atrybut class).
Zasady pracowni
Ćwiczenie na kartce · 5 minut
Ćwiczenie 2: ile razy wykona się pętla?
Bez komputera. Zapisz liczbę powtórzeń każdej pętli, potem sprawdź licznikiem w PHP.
// C$i = 10;
while ($i > 0) { $i -= 3; }
// D$i = 5;
do { $i++; } while ($i < 5);
Pułapki: w A licznik startuje od 0, w D warunek jest fałszywy od początku. Kto ma 4 na 4, tłumaczy C sąsiadowi.
Rozwiązanie
Pętla
Razy
Dlaczego?
A
10
$i = 0, 1, …, 9; przy 10 warunek fałszywy
B
5
$i = 1, 3, 5, 7, 9; 11 > 10
C
4
$i = 10 → 7 → 4 → 1 → −2; przy −2 koniec
D
1
do…while najpierw wykonuje, potem sprawdza; 6 < 5 fałsz
Na koniec
Sprawdź się
Z jakich trzech części składa się nagłówek for i kiedy każda z nich się wykonuje?
Kiedy wybieracie while zamiast for?
Czym różni się break od continue?
Następna lekcja: foreach, czyli pętla po tablicy, i lista uczniów z ocenami jako tabela HTML.
Poza szkołą
A jak to wygląda w produkcji?
Na lekcji
W produkcji
Status
for z licznikiem
Prawie każda pętla w aplikacji chodzi po danych z bazy (zamówienia, użytkownicy, produkty): to foreach po tablicy wierszy. for zostaje do numerowania: strony 1 do 10, kolumny tabeli.
nadal w użyciu
echo "<tr>…" w pętli
HTML siedzi w szablonie (Blade w Laravelu, Twig w Symfony): pętla @foreach w pliku z HTML, dane przychodzą osobno. Łatwiej czytać, grafik nie psuje PHP.
zastępowane
while (true) z break
Tak działają programy nasłuchujące: kolejka zadań, czat, serwer. Pętla kręci się godzinami i czeka na wiadomość; break kończy pracę.
nadal w użyciu
Pętla nieskończona przez pomyłkę
Skrypt ginie po 30 s (max_execution_time), ale przez te 30 s zajmuje procesor. Kilka takich żądań naraz i strona stoi dla wszystkich.