INF.03 · Aplikacje internetowe PHP

Pętle w PHP (for, while, foreach)

Powtarzaj z kontrolą końca.

  • PHP8.3
  • mysqli · MariaDB
  • Praktyka i diagnoza

Po tej lekcji: Dobierzesz for, while i foreach oraz sprawdzisz warunek zakończenia pętli.

Zrozum mechanizm

Pętla wykonuje podobne instrukcje wielokrotnie. Najpierw poznaj osobno każdą konstrukcję. Potem porównaj ich działanie w modelu i dopiero uruchom wspólny przykład. Iteracja oznacza jeden obieg, czyli jedno wykonanie ciała pętli.

Jak uruchamiać krótkie przykłady?

Każdy krótki przykład oznaczony własnym plikiem uruchamiaj osobno, nie doklejaj wszystkich definicji do jednego pliku. W edytorze zapisz go jako .php, a w terminalu tego folderu wpisz np. php for.php. Wtedy pokazane końce wierszy PHP_EOL są widoczne. W odpowiedzi HTML znak końca wiersza sam nie robi nowej linii na ekranie: użyj <br> albo znacznika <pre>. Wyświetl źródło pozwala zobaczyć tekst odpowiedzi.

Przykłady opisane jako fragment projektu wymagają paczki KINO / LAB i wcześniejszej konfiguracji. Nie uruchamiaj ich jako samodzielnych endpointów. Pełny plik niżej pokazuje kontekst. Funkcje h(), pole() i wymagajPost() są nasze; ich definicje wczytuje bootstrap.php.

1. for — powtarzanie z licznikiem

Masz wypisać trzy seanse. Zamiast trzech podobnych echo zastosuj licznik. Trzy części w nawiasie for oddzielasz średnikami, nie przecinkami.

Podstawowa forma: for (początek; warunek; zmiana) { instrukcje; }

for.phpphp
<?php
for ($numer = 1; $numer <= 3; $numer++) {
    echo "Seans $numer" . PHP_EOL;
}
Wynik
Seans 1
Seans 2
Seans 3
  1. $numer = 1 wykonuje się raz, przed pierwszym obiegiem. Ustawia licznik na 1.
  2. $numer <= 3 sprawdzamy przed każdym obiegiem. Przy 1 jest prawdą, więc wykonujemy blok i wypisujemy Seans 1.
  3. $numer++ zwiększa licznik o 1 po wykonaniu bloku. Potem wracamy do sprawdzenia warunku, a nie do ustawienia licznika na 1.
  4. Wypisujemy 1, 2 i 3. Po zwiększeniu do 4 warunek jest fałszywy, więc blok nie wykona się czwarty raz.
  5. Zmień <= na <. Zostaną dwa seanse: 1 i 2. Zmień początek na 0 przy <= 3: będą cztery obiegi.

2. while — dopóki warunek jest prawdziwy

W kasie zostały dwa bilety. Po każdym wydaniu biletu zmniejszamy ich liczbę. while nie ma w nagłówku osobnego miejsca na początek i krok: zapisujesz je samodzielnie.

Podstawowa forma: while (warunek) { instrukcje; zmiana_stanu; }

while.phpphp
<?php
$bilety = 2;
while ($bilety > 0) {
    echo "Pozostało: $bilety" . PHP_EOL;
    $bilety--;
}
echo 'Koniec';
Wynik
Pozostało: 2
Pozostało: 1
Koniec
  1. $bilety = 2 ustawia stan przed pętlą. Pytamy: czy 2 > 0? Tak, wypisujemy Pozostało: 2.
  2. $bilety-- zmniejsza wartość o 1. W następnym obiegu wypisujemy 1 i zmniejszamy do 0.
  3. Przy 0 warunek jest fałszywy. Przechodzimy za klamrę pętli i wypisujemy Koniec.
  4. Dla początkowego 0 blok nie wykona się ani razu. Bez zmniejszania bilety pozostałyby równe 2 i pętla nie miałaby końca. Nie uruchamiaj takiej wersji.

3. foreach — po kolei po wartościach tablicy

Znasz listę filmów, ale nie chcesz ręcznie pilnować jej długości. foreach bierze kolejny element i przypisuje go do zmiennej po as.

Podstawowa forma: foreach ($tablica as $wartosc) { instrukcje; }

foreach.phpphp
<?php
$filmy = ['Podróż', 'Kosmos', 'Ocean'];
foreach ($filmy as $tytul) {
    echo $tytul . PHP_EOL;
}
Wynik
Podróż
Kosmos
Ocean
  1. $filmy jest tablicą źródłową. $tytul to wymyślona przez nas nazwa zmiennej dla aktualnej wartości.
  2. as można czytać: dla każdego elementu z filmy użyj go jako tytul. Pierwszy obieg: Podróż, drugi: Kosmos, trzeci: Ocean.
  3. Nie dodajesz ++ i nie piszesz warunku z count. foreach kończy się po ostatnim elemencie.
  4. Po dopisaniu czwartego tytułu pojawi się czwarty wiersz. Dla [] nie pojawi się żaden.

foreach z kluczem i wartością

Czasem potrzebujesz nie tylko tytułu, ale również jego indeksu lub nazwy klucza. Dopisujesz zmienną przed =>.

Podstawowa forma: foreach ($tablica as $klucz => $wartosc) { instrukcje; }

foreach-klucz.phpphp
<?php
$filmy = ['Podróż', 'Kosmos'];
foreach ($filmy as $indeks => $tytul) {
    echo "$indeks: $tytul" . PHP_EOL;
}
$film = ['tytul' => 'Ocean', 'rok' => 2024];
foreach ($film as $pole => $wartosc) {
    echo "$pole: $wartosc" . PHP_EOL;
}
Wynik
0: Podróż
1: Kosmos
tytul: Ocean
rok: 2024
  1. => rozdziela klucz od wartości. To nie jest operator porównania ani strzałka zmiany kierunku pętli.
  2. W liście bez własnych kluczy pierwsze indeksy to 0 i 1. Indeks 0 wskazuje Podróż.
  3. W tablicy filmu kluczami są napisy tytul i rok. Te napisy trafiają do $pole, a Ocean i 2024 do $wartosc.

4. do...while — najpierw wykonaj, potem sprawdź

Ta odmiana przydaje się wtedy, gdy blok ma wykonać się przynajmniej raz. W odróżnieniu od while pytanie o dalsze działanie jest na końcu.

Podstawowa forma: do { instrukcje; } while (warunek);

do-while.phpphp
<?php
$licznik = 0;
do {
    echo "Próba $licznik";
    $licznik++;
} while ($licznik < 0);
Wynik
Próba 0
  1. Najpierw wykonuje się echo, mimo że późniejsze pytanie będzie fałszywe.
  2. Po zwiększeniu licznika do 1 sprawdzamy 1 < 0. Fałsz kończy pętlę.
  3. Średnik po while (...) jest tutaj częścią składni. Zwykłe while przy początkowym 0 i warunku <0 nie wypisałoby nic.

break i continue — dwie różne decyzje

Chcesz ominąć puste tytuły, a po napotkaniu znacznika STOP zakończyć przeglądanie.

Podstawowa forma: break; kończy najbliższą pętlę, continue; pomija resztę bieżącego obiegu

break-continue.phpphp
<?php
$filmy = ['Ocean', '', 'Kosmos', 'STOP', 'Las'];
foreach ($filmy as $tytul) {
    if ($tytul === '') {
        continue;
    }
    if ($tytul === 'STOP') {
        break;
    }
    echo $tytul . PHP_EOL;
}
Wynik
Ocean
Kosmos
  1. Ocean trafia do echo. Pusty napis uruchamia continue, więc w tym obiegu nie dochodzimy do echo.
  2. Kosmos też zostaje wypisany. STOP uruchamia break: kończymy całą pętlę, dlatego Las nie jest odwiedzany.
  3. W for instrukcja kroku działa także po continue. W while sam musisz zadbać, aby continue nie omijało zmiany potrzebnej do zakończenia.

Którą pętlę wybrać?

PętlaKiedy pomagaKiedy sprawdza warunek
forKontrolujesz licznik i jego zakresPrzed każdym obiegiem
whilePowtarzasz zależnie od zmiennego stanuPrzed każdym obiegiem; możliwe0 wykonań
do...whileBlok ma wykonać się przynajmniej razPo wykonaniu bloku
foreachOdwiedzasz elementy tablicyKończy po ostatnim elemencie; dla [] zero obiegów

Ćwiczenie z pomocą · samodzielna praca

Sprawdź, czy rozumiesz przebieg

W osobnym pliku wypisz numery 2,4,6,8 przez for. Potem odlicz 3,2,1 przez while. Na koniec wypisz tytuły z tablicy trzyelementowej przez foreach. Dla każdej pętli najpierw przewidź liczbę obiegów.

Oczekiwany rezultat
for:4 wiersze; while:3 wiersze; foreach:3 tytuły.
Potrzebujesz pomocy? Rozwiązuj krok po kroku.
Krok 1 — pokaż podpowiedź

W for początek to2,granica8,a krok musi dodawać2.

Krok 2 — pokaż podpowiedź

W while ustaw3 przed pętlą i zmniejszaj po wypisaniu.

Krok 3 — pokaż podpowiedź

W foreach zmienna po as otrzymuje bieżący tytuł; nie potrzebujesz licznika.

Otwórz tylko tyle podpowiedzi, ile potrzebujesz. Po każdym kroku wróć do zadania i sprawdź wynik.

Sprawdź w działaniu

Powtarzaj z kontrolą końca — sprawdź w modelu

Model w przeglądarce wyjaśnia mechanizm na fikcyjnych danych. Nie wykonuje PHP ani zapytań SQL i nie tworzy kont. Prawdziwe skrypty uruchomisz lokalnie z paczki.

Ta interakcja wymaga włączonego JavaScriptu.

Przewidź rezultat, wykonaj próbę i wyjaśnij, która decyzja po stronie serwera decyduje o wyniku.

Uruchom krok po kroku

Uruchom przykład i rozpisz osobno wyniki trzech pętli. Zmień początek for na 0 i sprawdź różnicę. W while odczytaj bilety przed i po zmniejszeniu. W foreach dopisz trzeci film i obserwuj indeks.

Plik wzorcowy: public/podstawy/04-petle.php

public/podstawy/04-petle.phpphp
<?php

for ($numer = 1; $numer <= 3; $numer++) {
    echo "Seans $numer\n";
}
$bilety = 2;
while ($bilety > 0) {
    echo "Pozostało: $bilety\n";
    $bilety--;
}
$filmy = ['Podróż', 'Kosmos'];
foreach ($filmy as $indeks => $tytul) {
    echo "$indeks: $tytul\n";
}

Pobierz i odtwórz projekt

W „Źródłach i materiałach” na końcu pobierz KINO / LAB.zip. Rozpakuj całość; instrukcja START.txt opisuje konfigurację. Pierwsze 6 przykładów w public/podstawy działa bez bazy. Dalsze wymagają lokalnej MariaDB 11.4, importu schema.sql i lokalnego konta bazy z minimalnymi prawami. Gotowa paczka pokazuje całość, ale w tej lekcji wykonaj opisane kroki i własne zadanie.

Ćwiczenie z pomocą · samodzielna praca

Twoja próba — podpowiedzi otwieraj po kolei

Wypisz 5 ponumerowanych seansów przez for, odlicz 3 bilety przez while i wypisz 3 tytuły przez foreach.

Oczekiwany rezultat
5 wierszy seansów,3 wiersze odliczania i 3 tytuły; żadna pętla nie działa bez końca.
Potrzebujesz pomocy? Rozwiązuj krok po kroku.
Krok 1 — pokaż podpowiedź

Odszukaj wskazany plik i zapisz przewidywany rezultat przed zmianą.

Krok 2 — pokaż podpowiedź

Zmień jedną rzecz. Sprawdź metodę żądania, dane i odpowiedź lub wynik programu.

Krok 3 — pokaż podpowiedź

Wykonaj próbę graniczną lub błędną. Porównaj także stan bazy lub sesji, nie tylko komunikat.

Otwórz tylko tyle podpowiedzi, ile potrzebujesz. Po każdym kroku wróć do zadania i sprawdź wynik.

Podsumowanie

Co warto zapamiętać

  1. Dobierzesz for, while i foreach oraz sprawdzisz warunek zakończenia pętli.
  2. Potrafisz wskazać w kodzie przyczynę wyniku i zaplanować próbę błędnych danych.
  3. Nie oddajesz haseł, pliku config.local.php ani wartości cookie.

Dalej na swoim koncie

Rozgrzewki, quiz i zadania są w biurku ucznia.

Teoria jest otwarta dla wszystkich. Żeby rozwiązywać zadania, zapisywać szkice i widzieć swój postęp, zaloguj się.

Zaloguj się →
Źródła i dalsza nauka