Az előző leckékben tanult ciklusokhoz képest a for ciklus komplexebb szerkezettel és funkcionalitással bír. A működése megegyezik a C nyelv for ciklusával. A szerkezete így néz ki:
for (első_kifejezés; második_kifejezés; harmadik_kifejezés) {
esemény;
}
Az első kifejezést egyszer hajtja végre, a ciklus kezdetén, majd ellenőrzi a második kifejezés kimenetét: ha IGAZ, akkor folyatja, ha HAMIS, a ciklus véget ér. Minden ciklus végén a harmadik kifejezés kiértékelésre kerül. Bármelyik kifejezés üres is lehet, vagy több kifejezést is tartalmazhat, vesszővel elválasztva, viszont a második kifejezés esetében értéket csak az utolsó elem adja (ez dönti el, hogy véget ér a ciklus, vagy nem). A második kifejezést üresen hagyva végtelen ciklust kapunk, mivel a PHP - akár a C - alapértelmezetten IGAZ értéket feltételez - ilyenkor a ciklust a már ismert break; utasítással szakíthatjuk meg.
A legegyszerűbb példán keresztül szemléltetjük a működését:
--------------------
<?php
for ($i = 0; $i < 10; $i++) { //Kezdőérték: 0; amíg $i kisebb, mint 10, növeljük eggyel
echo $i . ' '; // Kiírja az aktuális $i értékét
}
?>
--------------------
Több kifejezéses konstrukcióra példa:
--------------------
<?php
for ( $j = 10, $i = 1 ; $i < 10; $j++, $i++) { //Kezdőértékek felvétele: $j és $i; amíg $i kisebb, mint 10, növeljük eggyel a $j-t és az $i-t is
echo '$i: '. $i . ' $j: ' . $j . ' '; // Kiírja az aktuális $i és $j értékét
}
?>
--------------------
Mi történik, ha elhagyjuk az első kifejezést? Mivel a PHP nem követel előzetes változó deklarálást, így "röptében" fog létrejönni az $i változó, így lényegében a fenti teljes szerkezettel egyenértékű eredményt kapunk:
--------------------
<?php
for ( ; $i < 10; $i++) { //Kezdőérték: NULL; amíg $i kisebb, mint 10, növeljük eggyel
echo $i . ' '; // Kiírja az aktuális $i értékét
}
?>
--------------------
Figyelem! Ha a második kifejezés is kimarad, a ciklusunk sose ér véget! Ebben az esetben szükségünk lesz a break; utasításra:
--------------------
<?php
for ( ; ; $i++) { //Kezdőérték: NULL; nincs feltétel, viszont növeljük eggyel az $i-t
echo $i . ' '; // Kiírja az aktuális $i értékét
if ($i > 9) { // Ha az $i nagyobb, mint 9
break; // kitörés!
}
}
?>
--------------------
Menjünk még tovább: hagyjuk el a harmadik kifejezést is! Észrevehetjük, hogy az $i értékét így már semmi se növeli, újabb végtelen ciklus veszély áll fenn. Ilyenkor a ciklus belsejében növelhetjük az értéket:
--------------------
<?php
for ( ; ; ) { //Kezdőérték: NULL; nincs feltétel, nincs művelet
echo $i . ' '; // Kiírja az aktuális $i értékét
if ($i > 9) { // Ha az $i nagyobb, mint 9
break; // kitörés!
}
$i++; // Növeljük eggyel az $i-t
}
?>
--------------------
Az elhagyásos módszerek ugyanazt az eredményt produkálják, azonban figyeljünk oda egy fontos dologra: mivel a változót nem deklaráltuk, hanem futás közben jön létre, fontos biztonsági kockázatot jelent. A megoldás egyszerű: a ciklus kezdése előtt kapjon egy ellenőrzött kiindulóértéket:
--------------------
<?php
$i = 0; // Kezdőérték!
for ( ; ; ) {
echo $i;
if ($i > 9) {
break;
}
$i++;
}
?>
--------------------
Megjegyzés
A for ciklusokat ugyanúgy egymásba ágyazhatjuk, mint az előző leckében tanult while ciklusokat!
A későbbiekben, amikor interaktív kapcsolatba lépünk a PHP programunkkal látni fogjuk, hogy milyen veszélyeket rejt magában a nem deklarált változó. Webes környezetben használt PHP alapú oldalak támadásának egyik klasszikus módjáról van szó - de ez jövőbeli tananyagok témája lesz.
-----------------------------------------------------------------------------------------------------
Feladatok
1. Írjunk egy for ciklust, ahol csak a páros természetes számokat soroljuk fel 0-tól 100-ig.
2. Írjuk le for ciklussal az angol ábécé kisbetűit; használjuk ki a string növelés módszerét!
3. For ciklust használva írjuk ki a természetes számokat tízes sorokba! Használjuk ki a vesszővel elválasztott kifejezéseket!