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; }
<?php
for ($numer = 1; $numer <= 3; $numer++) {
echo "Seans $numer" . PHP_EOL;
}
Seans 1 Seans 2 Seans 3
-
$numer = 1wykonuje się raz, przed pierwszym obiegiem. Ustawia licznik na 1. -
$numer <= 3sprawdzamy przed każdym obiegiem. Przy 1 jest prawdą, więc wykonujemy blok i wypisujemy Seans 1. -
$numer++zwiększa licznik o 1 po wykonaniu bloku. Potem wracamy do sprawdzenia warunku, a nie do ustawienia licznika na 1. - Wypisujemy 1, 2 i 3. Po zwiększeniu do 4 warunek jest fałszywy, więc blok nie wykona się czwarty raz.
- 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; }
<?php
$bilety = 2;
while ($bilety > 0) {
echo "Pozostało: $bilety" . PHP_EOL;
$bilety--;
}
echo 'Koniec';
Pozostało: 2 Pozostało: 1 Koniec
-
$bilety = 2ustawia stan przed pętlą. Pytamy: czy 2 > 0? Tak, wypisujemy Pozostało: 2. -
$bilety--zmniejsza wartość o 1. W następnym obiegu wypisujemy 1 i zmniejszamy do 0. - Przy 0 warunek jest fałszywy. Przechodzimy za klamrę pętli i wypisujemy Koniec.
- 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; }
<?php
$filmy = ['Podróż', 'Kosmos', 'Ocean'];
foreach ($filmy as $tytul) {
echo $tytul . PHP_EOL;
}
Podróż Kosmos Ocean
-
$filmyjest tablicą źródłową.$tytulto wymyślona przez nas nazwa zmiennej dla aktualnej wartości. -
asmożna czytać: dla każdego elementu z filmy użyj go jako tytul. Pierwszy obieg: Podróż, drugi: Kosmos, trzeci: Ocean. - Nie dodajesz
++i nie piszesz warunku z count. foreach kończy się po ostatnim elemencie. - 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; }
<?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;
}
0: Podróż 1: Kosmos tytul: Ocean rok: 2024
-
=>rozdziela klucz od wartości. To nie jest operator porównania ani strzałka zmiany kierunku pętli. - W liście bez własnych kluczy pierwsze indeksy to 0 i 1. Indeks 0 wskazuje Podróż.
- 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);
<?php
$licznik = 0;
do {
echo "Próba $licznik";
$licznik++;
} while ($licznik < 0);
Próba 0
- Najpierw wykonuje się echo, mimo że późniejsze pytanie będzie fałszywe.
- Po zwiększeniu licznika do 1 sprawdzamy 1 < 0. Fałsz kończy pętlę.
- Ś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
<?php
$filmy = ['Ocean', '', 'Kosmos', 'STOP', 'Las'];
foreach ($filmy as $tytul) {
if ($tytul === '') {
continue;
}
if ($tytul === 'STOP') {
break;
}
echo $tytul . PHP_EOL;
}
Ocean Kosmos
- Ocean trafia do echo. Pusty napis uruchamia continue, więc w tym obiegu nie dochodzimy do echo.
- Kosmos też zostaje wypisany. STOP uruchamia break: kończymy całą pętlę, dlatego Las nie jest odwiedzany.
- 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ętla | Kiedy pomaga | Kiedy sprawdza warunek |
|---|---|---|
| for | Kontrolujesz licznik i jego zakres | Przed każdym obiegiem |
| while | Powtarzasz zależnie od zmiennego stanu | Przed każdym obiegiem; możliwe0 wykonań |
| do...while | Blok ma wykonać się przynajmniej raz | Po wykonaniu bloku |
| foreach | Odwiedzasz elementy tablicy | Koń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.
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.
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
<?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.
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ć
- Dobierzesz for, while i foreach oraz sprawdzisz warunek zakończenia pętli.
- Potrafisz wskazać w kodzie przyczynę wyniku i zaplanować próbę błędnych danych.
- 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ę →