PHP pętle for i while

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.

Pętla typu for

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.' '; 
	}
	?>
	

wynik: 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

Dodanie warunku przerwania jest konieczne ze względu na to, że pojawią się podwójne litery.
Bez tego zobaczymy:

wynik:
	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++);	
	?>	
	

wynik: i wynosi = 1, a j = 1
i wynosi = 2, a j = 3
i wynosi = 3, a j = 6
i wynosi = 4, a j = 10
i wynosi = 5, a j = 15
i wynosi = 6, a j = 21
i wynosi = 7, a j = 28
i wynosi = 8, a j = 36
i wynosi = 9, a j = 45
i wynosi = 10, a j = 55

Pętla typu while

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;
		

możliwe wyniki: 10, 14, 48, 19, 30, 24, 43, 39, 35, 23, 28,
23, 46, 30, 12, 36,

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 typu foreach

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 ";
	}
	?>		
	

wynik: czerwony zielony niebieski żółty

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>";
	}
	?>		
	

wynik: Piotrek ma 15 lat
Ania ma 17 lat
Janek ma 18 lat
Weronika ma 16 lat

Pętla w pętli

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>";
	}
		

wynik: Główna pętla nr: 1
Pętla wewnętrzna nr: 1 Pętla wewnętrzna nr: 2 Pętla wewnętrzna nr: 3 Pętla wewnętrzna nr: 4
Główna pętla nr: 2
Pętla wewnętrzna nr: 1 Pętla wewnętrzna nr: 2 Pętla wewnętrzna nr: 3 Pętla wewnętrzna nr: 4
Główna pętla nr: 3
Pętla wewnętrzna nr: 1 Pętla wewnętrzna nr: 2 Pętla wewnętrzna nr: 3 Pętla wewnętrzna nr: 4

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";
		}
	}
		

Przykłady użycia pętli

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;
		

Break i continue

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;
		

wynik: 0123456789101112131415


	$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]." ";
	}
		

wynik: Ala Monika

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]." ";
	}
		

wynik: Ala Monika Beata Alicja

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";
		
Projekt i wykonanie: Ryszard Rogacz© 1999−2024