Gyakran adódik olyan feladat, amikor egy utasítássort kell sokszor ismételni. Ilyenkor az helyett, hogy 'n'-szer leírnánk az utasítássort, úgy írjuk meg, hogy önmagát ismételje, amíg szükséges. Ezeket az önmagába visszatérő utasításokat nevezzük ciklusoknak. Szükség van ciklusokra, ha végig akarunk futtatni valamit, akár egy file-t olvasunk végig vagy számlálunk, de rengeteg egyéb dologra hasznosak. A PHP többféle ciklust támogat - ezekkel fogunk most megismerkedni.
A legegyszerűbb: a while ciklus
A while ciklusok a PHP legegyszerűbb ciklusai. Éppen úgy viselkednek, mint a C nyelvbeli megfelelőik. A while általános szintaxisa: while (feltétel) // addig fut, míg a feltétel igaz
{
utasítások;
}
?>
A ciklus minden lefutása előtt megvizsgálja a feltételt, addig fut amíg a feltétel igaz. Amint a feltétel hamis lesz, a ciklus ismétlődése megszakad. Mivel a feltétel a ciklus kezdetekor értékelődik ki, még ha az utasításblokk belsejében hamissá is válik a feltétel, a blokk végrehajtása akkor sem áll meg. Ha a while ciklusban több utasítást is kiadunk, használjunk kapcsos zárójeleket. while ( $szamlalo < 10 ) // itt adjuk a feltételt
{
print ($szamlalo ." "); // ezt a blokkot hajtja végre többször is
$szamlalo++;
}
?>
Hogyan működik? Adtunk egy kezdeti értéket a $szamlalo változónak, a ciklus lefutásának feltétele, hogy a $szamlalo 10-nél kisebb legyen. Mivel a ciklusban a $szamlalo értékét mindig eggyel növeljük, a 9. lefutáskor a feltételünk már nem teljesül - a ciklus leáll és a program továbblép a következő kódrészre.
A példát megnézheted működés közben is itt (8/1 demo).
Figyelem: Ciklusoknál írásánál mindig ügyeljünk arra, hogy biztosítva legyen annak leállása, különben könnyen válhat végtelen ciklussá. Ilyenkor a kód végrehajtása megáll ennél a résznél, addig ismétli, amíg a PHP időtúllépés miatt hibaüzenettel leáll. Íme egy példa végtelen ciklusra - csak nézzük meg, miről van szó, de ezt nem kell kipróbálni: // HIBÁS KÓD, végtelen ciklust eredményez
while ( $szamlalo < 10 )
{
print ($szamlalo ." ");
}
?>
Ugye, csak egy kifejezés maradt ki, és ott a baj... ;-)
fel...
Ugyenez fordítva: do while
Előfordulhat, hogy a ciklusba zárt utasításnak egyszer mindenképpen le kell futnia - akkor is, ha a feltétel mindig hamis. Ilyenkor használjuk a hátultesztelő do .. while ciklust, ahol a feltétel teljesülését a ciklus végén vizsgáljuk. Az első lefutásnak tehát a hamis feltétel sem akadálya. Így néz ki: do
{
utasítások;
}
while (feltétel);
?>
Figyelem: A do while ciklusnál a feltétel után ki kell tenni a sorvégi ; pontosvesszőt.
fel...
A sokoldalú: a for ciklus
A következő a for ciklus. Bár ez semmivel nem ad többet mint az elől vagy hátultesztelő while ciklus, de mivel rugalmasan beállítható, elterjedten használják.
Meghatározunk benne egy változót, adunk egy feltételt, amíg a ciklus ismétlődik, végül minden lefutáskor növeljük, esetleg csökkentjük eggyel. Változóként hagyományosan a $i nevű változót szokás használni erre a célra. for ( változó meghatározása; feltétel; változó növelése)
{
utasítások;
}
?>
Mint látjuk, a for ciklusnak numerikus feltételt adhatunk - azaz a változó egy szám, amit aztán lehet lefutásonként növelni/csökkenteni, feltételként pedig egy érték elérését adhatjuk meg. A for ciklussal rövidebb és egyszerűbb ciklusokat írhatunk. Lássunk most erre is egy életszagúbb példát: print ("A hónap napjai: ");
for ( $i = 1; $i <= 31; $i++)
{
print ($i . " "); // kiírja a hónap napjait
}
?>
Példakódunkat élőben is megnézheted itt (8/3 demo).
fel...
És végül: a foreach
A PHP 4-ben megjelent a Perlhez és más nyelvekhez hasonló ún. foreach ciklusszerkezet is. Mivel a foreach jól kezeli a nem numerikus feltételeket is, jól használható a tömbökön végzett műveletekhez. Ezt a ciklust kétféle szintakszissal is használjuk: foreach (tömb_kifejezés as $ertek)
{
utasítások;
}
?>
foreach (tömb_kifejezés as $kulcs => $ertek)
{
utasítások;
}
?>
Az első forma végigmegy a tömb_kifejezés szolgáltatta tömbön. Minden alkalommal az aktuális elem értéke a $ertek változóba kerül, és a belső tömb mutatót eggyel megnöveli. A második forma ugyanezt végzi el, de az aktuális elem kulcsa a $kulcs változóba kerül. foreach ($tomb as $ertek)
{
print ("Érték: $ertek \n");
}
?>
Ez egyelőre kicsit kínainak tűnhet, mivel szóba kerültek eddig ismeretlen fogalmak is. A teljes felsorolás igénye miatt került ide, ha elolvastad a tömbökkel foglalkozó részt, érdemes lesz visszatérni - minden világosabb lesz.
Példakódunkat élőben is megnézheted itt (8/4 és 8/5 demo).
fel...
A break és a continue
A vezérlési szerkezetekhez használhatjuk ezt a további két elemet. Segítségükkel részletesen beállíthatjuk azok működését.
A break azonnal kilép az aktuális for, foreach, while, do..while ciklusból vagy switch szerkezetből - akár az aktuális ciklus futása közben is úgy, hogy a ciklus hátralevő része nem lesz végrehajtva.
Ha több ciklust ágyazunk egymásba, használhatjuk a break elhagyható paraméterét, megadva vele, hány egymásba ágyazott ciklusból kell kilépnie. while (list (, $ertek) = each ($tomb))
{
if ($ertek == "stop")
{
break; // írhattam volna ide 'break 1;'-et is
}
print ("$ertek \n");
}
?>
Példakódunkat itt (8/6 demo) láthatod működés közben.
A continue segítségével átugorhatjuk a ciklus aktuális lefutásának hátralevő részét, és a végrehajtást a következő lefutással folytathatjuk.
A continue is elfogad egy elhagyható szám paramétert, amely megadja, hogy hány egymásba ágyazott struktúrának a hátralévő részét kell átugrani. while (list ($kulcs, $ertek) = each ($tomb)) {
if (!($kulcs % 2)) { // a páros indexűek kihagyása
continue;
}
valami_paratlan_dolog ($ertek);
}
?>
A break és a continue után mindig ki kell tenni a ; pontosvessző lezárást. |