A ciklusok, amint a nevük is mutatja, valamilyen kritérium alapú ismétlődő folyamatokat jelentenek. Szintén a valós életből vett példából kiindulva szemléltetjük a működésüket. Képzeljük el, hogy épp levest ebédelünk. Mi történik az agyunkban? A kezünk azt az utasítást kapja, hogy amíg van leves a tányérban, kanalazzunk. Ez is egy ciklus: a mozdulat ugyanaz, és addig ismétlődik, amíg az adott feltétel fennáll.
A PHP-ban a legegyszerűbb ciklus a while, a szerkezete:
while (feltétel) {
következmény;
}
Egy fontos dologra oda kell figyelni: a ciklus addig ismétlődik, amíg a feltétel IGAZ. A tesztelés az elején történik, vagyis ha a feltétel HAMIS értékkel indul, a ciklus belsejében levő kód sose fut le.
Bármennyire egyszerű a ciklus szerkezete, hatalmas csapdalehetőség is egyben. Képzeljük el, mi történik, ha a feltétel értéke sose változik, és mindig IGAZ lesz. A ciklus sose ér véget, mivel az alapfeltétel az, hogy addig kell ismételni, amíg a feltétel HAMIS nem lesz. Ezt hívjuk végtelen ciklusnak. Mivel folyton ismétlődik, számtalan bajt okozhat abban az esetben, ha semmiféle megszakítás nincs a ciklusban: processzor túlterheléstől kezdve memória elfogyásán keresztül a háttértár kimerítéséig. Ezért minden esetben járjunk el körültekintően a ciklusok létrehozásakor!
--------------------
<?php
$szam = 0;
while ($szam <= 10) { // Amíg a $szam kisebb vagy egyenlő 10-zel,
echo $szam++ . ' '; // eggyel növeli a $szam értékét, hozzáfűz egy szóközt és kiírja azt.
}
?>
--------------------
A fenti példa kiírja a természetes számokat 0-tól 10-ig. Amint látjuk, a feltétel addig IGAZ marad, amíg a $szam változó értéke el nem éri a 11-et, ami már nagyobb, mint a feltételben szereplő 10. Ekkor feltétel kiértékelése HAMIS lesz, és a ciklus véget ér.
Előfordulnak olyan esetek, amikor a feltétel kiértékelésétől függetlenül legalább egyszer le kell futnia a ciklusnak. Mivel nem tudjuk garantálni, hogy a feltétel IGAZ, vagy HAMIS értékkel indul, így a fenti while szerkezetet nem használhatjuk. Ebben az esetben a do .. while a megoldás. A do .. while ciklus a végén teszteli a feltételt, és amennyiben a kiértékelése IGAZ, újra lefut. Ez garantálja a minimum egyszeri futást. A szerkezete így néz ki:
do {
következmény;
} while (feltétel);
Az alábbi példa szemlélteti a működést:
--------------------
<?php
$szam = 0;
do {
echo $szam; // Kiírja: 0
} while ( $szam > 0 ); // A feltétel azonnal HAMIS!
?>
--------------------
Kitörés a ciklusból
Előfordulhat olyan eset, hogy nem várhatjuk meg a feltétel kiértékelését, hanem a cikluson belüli változás azonnali kilépést követel. Ilyenkor a break; kulcsszóval tudjuk azonnal befejezni a ciklust:
--------------------
<?php
$szam = 0;
while ( $szam <= 10 ) {
echo $szam++ . ' ';
if ($szam === 5) {
break;
}
}
?>
--------------------
Ciklus a ciklusban
Az alábbi példa az egymásba ágyazott ciklusok működését mutatja be:
--------------------
$szam = 1;
$masik_szam = 1;
$betu = 'a';
while ($masik_szam <= 10) { // Belső ciklus fut
$masik_szam++;
echo $betu++; // Stringet növelünk!
}
$masik_szam = 1; // Visszaállunk alapértékre...
$betu = 'a';
echo "\n"; // Új sor karakter
}
?>
--------------------
A példakód az angol ábécé első 10 betűjét írja ki 10 sorszámozott sorban:
1:abcdefghij
2:abcdefghij
3:abcdefghij
4:abcdefghij
5:abcdefghij
6:abcdefghij
7:abcdefghij
8:abcdefghij
9:abcdefghij
10:abcdefghij
Megjegyzés
Az egymásba ágyazott ciklusok száma nincs korlátozva. Tervezésnél azonban tartsuk szem előtt a ciklusok mennyiségét: az egymásba ágyazott ciklusoknál az egyes mélységek számának szorzata lesz a véglegesen lefutott körök száma. Jelen példában: 10 x 10 = 100 ismétlődés történt: még egy szint közbeiktatásakor viszont már 1000 lenne!
-----------------------------------------------------------------------------------------------------
Feladatok
1. Írjuk le a természetes számokat 100 és 80 között, csökkenő sorrendben!
2. Írjuk le a nevünket százszor!
3. Írjuk le az angol ábécét az "f" betűig! A feladat megoldásához használjuk a break; utasítást!