← Lekcje
PHP · lekcja 06

Pętle 1/2: for i while

Jak powtórzyć kod 100 razy bez kopiowania?

  1. Po co pętla? 100 wierszy tabeli w trzech linijkach
  2. for: start, warunek, krok (liczenie okrążeń)
  3. while i do…while: dopóki warunek (mieszanie zupy)
  4. Ćwiczenie: tabliczka mnożenia w multiplication-table.php
Rozgrzewka · 3 minuty

Rozgrzewka: if i switch

$grade = 3;
if ($grade >= 2) { echo "zdane"; } else { echo "niezdane"; }
  1. Co wypisze ten kod i co wypisze dla $grade = 1?
  2. Kiedy zamiast kilku elseif lepiej napisać switch albo match?
  3. Co da echo $grade >= 2 ? "zdane" : "niezdane";? Jak nazywa się ten zapis?
Część 1 · Po co pętla?

100 wierszy tabeli bez kopiowania

echo "<tr><td>1</td></tr>";
echo "<tr><td>2</td></tr>";
echo "<tr><td>3</td></tr>";
// ... jeszcze 97 linii ...
echo "<tr><td>100</td></tr>";

100 linii. Zmiana koloru wiersza to 100 poprawek.

for ($i = 1; $i <= 100; $i++) {
    echo "<tr><td>$i</td></tr>";
}

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
Część 2 · for

for: start, warunek, krok

1 2 3 4 5 okrążenia = powtórzenia $lap = 1 $lap <= 5 $lap++ STARTraz, na starcie WARUNEKprzed okrążeniem KROKpo okrążeniu warunek fałszywy = koniec biegu (po 5. okrążeniu $lap ma 6)
for ($lap = 1; $lap <= 5; $lap++) {
    echo "Okrążenie $lap<br>";      // Okrążenie 1 … Okrążenie 5
}

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
Część 3 · while

while: dopóki warunek jest prawdziwy

warunek? $thickness < 4 tak ciało pętli: mieszaj $thickness++ znów do bramki nie koniec zupa gęsta, wyłączam gaz
$thickness = 1;
while ($thickness < 4) {
    echo "Mieszam, gęstość: $thickness<br>";
    $thickness++;
}
// Mieszam, gęstość: 1
// Mieszam, gęstość: 2
// Mieszam, gęstość: 3

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.

for ($i = 1; $i <= 10; $i++) {
    if ($i % 2 === 0) {
        continue;   // pomiń parzyste
    }
    echo $i . " ";
}
// 1 3 5 7 9

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
Część 5 · HTML w pętli

Pętla w pętli: tabliczka mnożenia

echo "<table>";
for ($row = 1; $row <= 10; $row++) {
    echo "<tr>";
    for ($col = 1; $col <= 10; $col++) {
        echo "<td>" . $row * $col . "</td>";
    }
    echo "</tr>";
}
echo "</table>";

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.

$col = 1 … 10 → $row = 1 … 10 ↓ 36912151821242730 12310 10100 $row = 3, $col = 5 → 15
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?

  1. 0
  2. 5
  3. 25
  4. 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?

  1. a = 40, i = 0
  2. a = 0, i = 20
  3. a = 20, i = 20
  4. 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.

CKE, EE.09, czerwiec 2022, zad. 8 · CKE, EE.09, styczeń 2024, zad. 6
Ćwiczenie przy komputerze · 10 minut

Ćwiczenie 1: multiplication-table.php

  1. 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; }.
  2. 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>.
  3. 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;.
  4. 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.

// A
for ($i = 0; $i < 10; $i++) { … }

// B
for ($i = 1; $i <= 10; $i += 2) { … }
// 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ętlaRazyDlaczego?
A10$i = 0, 1, …, 9; przy 10 warunek fałszywy
B5$i = 1, 3, 5, 7, 9; 11 > 10
C4$i = 10 → 7 → 4 → 1 → −2; przy −2 koniec
D1do…while najpierw wykonuje, potem sprawdza; 6 < 5 fałsz
Na koniec

Sprawdź się

  1. Z jakich trzech części składa się nagłówek for i kiedy każda z nich się wykonuje?
  2. Kiedy wybieracie while zamiast for?
  3. 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 lekcjiW produkcjiStatus
for z licznikiemPrawie 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ętliHTML 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 breakTak 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.unikane
max_execution_time (domyślnie 30 s): PHP Manual · php.net/manual/en/info.configuration.php
← → slajdy · F pełny ekran · S spis