Pętlę w programowaniu pozwalają nam wykonywać dany kod zadaną ilość razy.
Poniżej zajmiemy się klasycznymi pętlami, które istnieją w większości języków - w tym w PHP.
Jednym z najczęściej stosowanych typów pętli jest instrukcja for.
for (zainicjowanie_zmiennych; warunek_kończący_wykonywanie_pętli; zmiana_zmiennych) {
kod który zostanie wykonany pewną ilość razy
}
Pętle takie najczęściej stosuje się w sytuacjach, kiedy dokładne znamy liczbę powtórzeń - od - do:
//pętla od 0 do 99
for ($i=0; $i<100; $i++) {
echo "Nie będę rozmawiał na zajęciach.<br>";
}
W każdej pętli mamy dostęp do jej licznika:
for ($i=0; $i<10; $i++) {
echo "Wykonanie pętli $i<br>";
}
$sum = 0;
for ($i=0; $i<10; $i++) {
$sum += $i;
}
echo $sum; //45
Pętle spokojnie mogą odliczać w przeciwnym kierunku:
for ($i=10; $i>0; $i--) {
echo "Trwa odliczanie $i";
}
A sam warunek kończący wcale nie musi wyglądać jak powyżej:
$a = 10;
$b = 20;
for ($i=1; $i<=a && $i<=b; $i++) {
//bo oba muszą być prawdziwe
echo "Wypisze się tyle co ma mniejsza liczba $i";
}
Pętle mogą operować na literach:
<php
for ($i = 'a'; $i <= 'z'; $i++) {
if($i == 'aa') break;
echo $i.' ';
}
?>
Dodanie warunku przerwania jest konieczne ze względu na to, że pojawią się podwójne litery.
Bez tego zobaczymy:
a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar... ...yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz
Pętla for może przyjmować wiele warunków, będą one wykonywane po sobie.
<php
for ($i = 1, $j = 0; $i <= 10; $j += $i, print "i wynosi = $i, a j = $j<br>", $i++);
?>
Pętla while (dopóki) to kolejny typ pętli, który można spotkać w wielu językach.
Struktura tej pętli ma następującą postać:
while (wyrażenie_sprawdzające_zakończenie_pętli) {
fragment kodu który będzie powtarzany
}
Zauważ, że w pętli tego typu nie definiujemy ani początkowego licznika, ani nie definiujemy zmiany licznika.
Musimy te rzeczy zrobić ręcznie:
$i = 1;
while ($i <= 100) {
echo "Nie będę...<br>";
$i++;
}
Jeżeli w powyższym kodzie pętli nie zwiększalibyśmy zmiennej i, wówczas pętla ta wykonywała by się w nieskończoność (infinite loop), co zaowocowało by "zawieszeniem" strony.
Pętlę while zazwyczaj stosuje się w sytuacjach, kiedy nie wiemy dokładnie, ile iteracji (powtórzeń) ma się wykonać.
Wyobraź sobie, że chcesz wygenerować unikalny numer ID albo jakąś liczbę.
Generujesz więc daną rzecz, następnie sprawdzasz czy wynik pasuje do założeń.
Jak nie pasuje, generujesz dalej.
I tak do skutku aż trafisz.
Przykład generowania liczb z zakresu (10...70) do momentu gdy wylosowana liczba jest mniejsza od 50.
$i = rand(10, 70);
while ($i < 50) {
echo $i;
$i = rand(10, 70);
}
echo $i;
W powyższym przykładzie istnieje przypadek, że nie zostanie wygenerowana żadna liczba
(pierwsze losowanie i zmienna $i przyjmuje wartość większą, równą 50).
Istnieje zatem wariant pętli while, w której instrukcje wykonają się przynajmniej raz:
$i = 0;
do {
$i++;
echo $i;
} while ($i < 5);
Taki typ pętli wykona się minimum 1 raz.
$i = 0;
do {
$i++;
echo $i;
} while (false); //warunek od początku nie spełniony ale i tak 1 raz się wykona
Pętla foreach działa tylko na tablicach i służy do przechodzenia przez każdą parę klucz/wartość w tablicy.
Składnia:
<php
foreach ($array as $value) {
kod do wykonania;
}
?>
Dla każdej iteracji pętli wartość bieżącego elementu tablicy jest przypisywana do $value, a wskaźnik tablicy jest przesuwany o jeden, aż dotrze do ostatniego elementu tablicy.
Poniższy przykład wyświetli wartości podanej tablicy ($kolory):
<?php
$kolory = array("czerwony", "zielony", "niebieski", "żółty");
foreach ($kolory as $wartosc) {
echo "$wartosc ";
}
?>
Poniższy przykład wyświetli zarówno klucze, jak i wartości podanej tablicy ($lata):
<?php
$lata = array("Piotrek"=>"15", "Ania"=>"17", "Janek"=>"18", "Weronika"=>"16");
foreach($lata as $klucz => $wartosc) {
echo "$klucz ma $wartosc lat<br>";
}
?>
Czasami musimy wykonać zadania "n - wymiarowe".
Dla przykładu przy wypisywaniu tabliczki mnożenia musimy utworzyć 10 kolumn z 10 komórkami.
Do takich działań stosujemy pętle w pętlach.
Poniższy przykład pokazuje wykonanie 3 operacji w pętli głównej ($i=1 do $i=3).
W każdym przebiegu pętli głównej wykonują się 4 operacje wewnętrzne.
for ($i=1; $i<=3; $i++) {
echo "Główna pętla nr: $i<br>";
for ($j=1; $j<=4; $j++) {
echo "Pętla wewnętrzna nr: $j ";
}
echo "<br>";
}
Co ważne, wewnętrzne pętle mają dostęp do liczników pętli zewnętrznych.
Bardzo ważne jest by pętle wewnętrzne miały inny licznik niż główna pętla.
for ($i=0; $i<10; $i++) {
for ($j=0; $j<6; $j++) {
echo "Główna pętla: $i, pętla zagnieżdżona: $j";
}
}
Powiedzmy, że chcemy wypisać tekst:
******
Wykorzystajmy do tego pętlę:
$str = "";
for ($j=0; $j<6; $j++) {
$str .= "*";
}
echo str;
Dodajemy kolejny poziom skomplikowania. Załóżmy, że chcemy wypisać poniższy tekst:
******
******
******
******
Użyjmy do tego pętli w pętli:
$str = "";
for ($i=0; $i<4; $i++) {
for ($j=0; $j<6; $j++) {
$str .= "*";
}
$str .= "<br>";
}
echo $str;
Pozostaje poziom hard. Załóżmy że chcemy wypisać:
******
*----*
*----*
******
Użyjmy do tego pętli w pętli, w której zbadamy dane liczniki:
$str = "";
for ($i=0; $i<4; $i++) {
for ($j=0; $j<6; $j++) {
if ($i==0 || $i==3 || $j==0 || $j==5) {
$str .= "*";
} else {
$str .= "-";
}
}
$str .= "<br>";
}
echo $str;
Czasami podczas pętli gdy wykonamy jakąś czynność - czy to wypiszemy dany element, czy go sprawdzimy, chcielibyśmy zakończyć dalsze wykonywanie takiej pętli. Służy do tego instrukcja break.
$str = '';
$i = 0;
while ($i <= 100) {
$str .= $i;
if (strlen($str) > 20) break;
$i++;
}
echo $str;
$tab = ["Ala", "Monika", "Beata", "Karol"];
$userExist = false;
for ($i=0; $i<count($tab); $i++) {
if ($tab[$i] === "Beata") {
$userExist = true;
break; //dalej nie ma sensu sprawdzać
}
echo $tab[$i]." ";
}
Drugą instrukcją jest continue.
Nie przerywa ona działania pętli, a powoduje przerwanie
danej iteracji (czyli aktualnego powtórzenia):
$tab = ["Ala", "Monika", "Beata", "Karol", "Alicja"]
for ($i=0; $i<count($tab); $i++) {
if ($tab[$i] === "Karol") {
continue; //Karola pomiń
}
echo $tab[$i]." ";
}
Przykład zastosowania w pętli while
$i = 0;
$sum = 0;
while ($i < 5) {
$i++;
if ($i === 3) continue;
sum += $i;
echo "$i suma kolejnych liczb to $sum";
}
Zwróć uwagę, że gdy stosujemy continue w pętli while, zwiększanie licznika musimy robić przed użyciem
tej instrukcji.
Inaczej możemy trafić na moment, gdy aktualne powtórzenie będzie przerywane a tym samym zwiększanie licznika
nigdy nie nastąpi.
$i = 0;
$sum = 0;
while ($i < 100) {
$i++;
if ($i % 2 === 0) continue; //gdy i jest parzyste przerywamy daną iterację i przechodzimy do następnej
$sum += i;
}
echo "$i suma kolejnych liczb to $sum";