Wynikiem działania poniższej pętli for w przedstawionym kodzie PHP jest wyświetlenie liczb:
<?php
for($i=5;$i>1;$i-=2)
echo ($i%2)." ";
?>
W tej pętli kluczowe jest spokojne przejście po trzech częściach instrukcji for: inicjalizacji, warunku oraz kroku po każdym obiegu. Zmienna $i startuje od wartości 5. Warunek wykonania pętli to $i > 1, więc ciało pętli działa tylko wtedy, gdy $i jest większe od 1. W pierwszym obiegu mamy $i = 5, a wyrażenie $i % 2 daje resztę z dzielenia przez 2. Liczba 5 jest nieparzysta, więc reszta wynosi 1 i zostaje wypisane 1. Następnie wykonywany jest krok $i -= 2, czyli $i zmniejsza się do 3. Warunek nadal jest spełniony, bo 3 > 1, więc znowu liczymy 3 % 2, co także daje 1. Po tym $i spada do 1, a warunek 1 > 1 jest fałszywy, więc pętla się kończy. Wynik to 1 1. Moim zdaniem najbezpieczniejsza metoda przy takich zadaniach to krótka tabelka z wartościami zmiennej, bo w prawdziwym PHP bardzo łatwo pomylić moment sprawdzania warunku z momentem zmiany licznika. Operator % jest często używany praktycznie, np. do sprawdzania parzystości identyfikatorów, numerów wierszy tabeli czy cyklicznego wykonywania operacji co n-ty element. Dobra praktyka to też czytelne formatowanie pętli i unikanie zbyt skomplikowanych wyrażeń w jednej linii, bo potem debugowanie robi się średnio przyjemne.
W tym zadaniu najczęstsza pomyłka polega na założeniu, że skoro licznik zmniejsza się o 2, to reszta z dzielenia przez 2 będzie się zmieniała naprzemiennie między 1 i 0. Tak jednak nie działa arytmetyka modulo. Jeżeli zaczynamy od liczby nieparzystej, czyli od 5, i za każdym razem odejmujemy 2, to cały czas zostajemy przy liczbach nieparzystych: 5, 3, 1, -1 i tak dalej. W tej konkretnej pętli wartością 1 już się nie zajmujemy w ciele pętli, bo warunek brzmi $i > 1. To oznacza, że ciało pętli wykona się dla $i = 5 oraz $i = 3, ale nie dla $i = 1. Dlatego nie może pojawić się wynik zawierający 0, bo ani 5 % 2, ani 3 % 2 nie daje zera. Zero pojawiłoby się dopiero przy liczbie parzystej, na przykład 4 % 2 albo 2 % 2. Drugi typowy błąd to doliczenie dodatkowego obiegu dla $i = 1. W pętli for w PHP warunek jest sprawdzany przed wykonaniem ciała pętli, a nie po nim. Gdy po drugim obiegu zmienna $i zostaje zmniejszona z 3 do 1, interpreter wraca do warunku i sprawdza 1 > 1. To jest fałsz, bo 1 nie jest większe od 1, tylko równe 1. Z mojego doświadczenia takie zadania najlepiej rozpisywać krok po kroku: wartość licznika, wynik modulo, potem zmiana licznika. Wtedy od razu widać, że odpowiedzi z trzema lub czterema liczbami zakładają zbyt dużą liczbę iteracji, a odpowiedzi z zerem zakładają pojawienie się liczby parzystej, której tu po prostu nie ma.