Gyakran addik olyan feladat, amikor egy utastssort kell sokszor ismtelni. Ilyenkor az helyett, hogy 'n'-szer lernnk az utastssort, gy rjuk meg, hogy nmagt ismtelje, amg szksges. Ezeket az nmagba visszatr utastsokat nevezzk ciklusoknak. Szksg van ciklusokra, ha vgig akarunk futtatni valamit, akr egy file-t olvasunk vgig vagy szmllunk, de rengeteg egyb dologra hasznosak. A PHP tbbfle ciklust tmogat - ezekkel fogunk most megismerkedni.
A legegyszerbb: a while ciklus
A while ciklusok a PHP legegyszerbb ciklusai. ppen gy viselkednek, mint a C nyelvbeli megfelelik. A while ltalnos szintaxisa: while (felttel) // addig fut, mg a felttel igaz
{
utastsok;
}
?>
A ciklus minden lefutsa eltt megvizsglja a felttelt, addig fut amg a felttel igaz. Amint a felttel hamis lesz, a ciklus ismtldse megszakad. Mivel a felttel a ciklus kezdetekor rtkeldik ki, mg ha az utastsblokk belsejben hamiss is vlik a felttel, a blokk vgrehajtsa akkor sem ll meg. Ha a while ciklusban tbb utastst is kiadunk, hasznljunk kapcsos zrjeleket. while ( $szamlalo < 10 ) // itt adjuk a felttelt
{
print ($szamlalo ." "); // ezt a blokkot hajtja vgre tbbszr is
$szamlalo++;
}
?>
Hogyan mkdik? Adtunk egy kezdeti rtket a $szamlalo vltoznak, a ciklus lefutsnak felttele, hogy a $szamlalo 10-nl kisebb legyen. Mivel a ciklusban a $szamlalo rtkt mindig eggyel nveljk, a 9. lefutskor a felttelnk mr nem teljesl - a ciklus lell s a program tovbblp a kvetkez kdrszre.
A pldt megnzheted mkds kzben is itt (8/1 demo).
Figyelem: Ciklusoknl rsnl mindig gyeljnk arra, hogy biztostva legyen annak lellsa, klnben knnyen vlhat vgtelen cikluss. Ilyenkor a kd vgrehajtsa megll ennl a rsznl, addig ismtli, amg a PHP idtllps miatt hibazenettel lell. me egy plda vgtelen ciklusra - csak nzzk meg, mirl van sz, de ezt nem kell kiprblni: // HIBS KD, vgtelen ciklust eredmnyez
while ( $szamlalo < 10 )
{
print ($szamlalo ." ");
}
?>
Ugye, csak egy kifejezs maradt ki, s ott a baj... ;-)
fel...
Ugyenez fordtva: do while
Elfordulhat, hogy a ciklusba zrt utastsnak egyszer mindenkppen le kell futnia - akkor is, ha a felttel mindig hamis. Ilyenkor hasznljuk a htultesztel do .. while ciklust, ahol a felttel teljeslst a ciklus vgn vizsgljuk. Az els lefutsnak teht a hamis felttel sem akadlya. gy nz ki: do
{
utastsok;
}
while (felttel);
?>
Figyelem: A do while ciklusnl a felttel utn ki kell tenni a sorvgi ; pontosvesszt.
fel...
A sokoldal: a for ciklus
A kvetkez a for ciklus. Br ez semmivel nem ad tbbet mint az ell vagy htultesztel while ciklus, de mivel rugalmasan bellthat, elterjedten hasznljk.
Meghatrozunk benne egy vltozt, adunk egy felttelt, amg a ciklus ismtldik, vgl minden lefutskor nveljk, esetleg cskkentjk eggyel. Vltozknt hagyomnyosan a $i nev vltozt szoks hasznlni erre a clra. for ( vltoz meghatrozsa; felttel; vltoz nvelse)
{
utastsok;
}
?>
Mint ltjuk, a for ciklusnak numerikus felttelt adhatunk - azaz a vltoz egy szm, amit aztn lehet lefutsonknt nvelni/cskkenteni, felttelknt pedig egy rtk elrst adhatjuk meg. A for ciklussal rvidebb s egyszerbb ciklusokat rhatunk. Lssunk most erre is egy letszagbb pldt: print ("A hnap napjai: ");
for ( $i = 1; $i <= 31; $i++)
{
print ($i . " "); // kirja a hnap napjait
}
?>
Pldakdunkat lben is megnzheted itt (8/3 demo).
fel...
s vgl: a foreach
A PHP 4-ben megjelent a Perlhez s ms nyelvekhez hasonl n. foreach ciklusszerkezet is. Mivel a foreach jl kezeli a nem numerikus feltteleket is, jl hasznlhat a tmbkn vgzett mveletekhez. Ezt a ciklust ktfle szintakszissal is hasznljuk: foreach (tmb_kifejezs as $ertek)
{
utastsok;
}
?>
foreach (tmb_kifejezs as $kulcs => $ertek)
{
utastsok;
}
?>
Az els forma vgigmegy a tmb_kifejezs szolgltatta tmbn. Minden alkalommal az aktulis elem rtke a $ertek vltozba kerl, s a bels tmb mutatt eggyel megnveli. A msodik forma ugyanezt vgzi el, de az aktulis elem kulcsa a $kulcs vltozba kerl. foreach ($tomb as $ertek)
{
print ("rtk: $ertek \n");
}
?>
Ez egyelre kicsit knainak tnhet, mivel szba kerltek eddig ismeretlen fogalmak is. A teljes felsorols ignye miatt kerlt ide, ha elolvastad a tmbkkel foglalkoz rszt, rdemes lesz visszatrni - minden vilgosabb lesz.
Pldakdunkat lben is megnzheted itt (8/4 s 8/5 demo).
fel...
A break s a continue
A vezrlsi szerkezetekhez hasznlhatjuk ezt a tovbbi kt elemet. Segtsgkkel rszletesen bellthatjuk azok mkdst.
A break azonnal kilp az aktulis for, foreach, while, do..while ciklusbl vagy switch szerkezetbl - akr az aktulis ciklus futsa kzben is gy, hogy a ciklus htralev rsze nem lesz vgrehajtva.
Ha tbb ciklust gyazunk egymsba, hasznlhatjuk a break elhagyhat paramtert, megadva vele, hny egymsba gyazott ciklusbl kell kilpnie. while (list (, $ertek) = each ($tomb))
{
if ($ertek == "stop")
{
break; // rhattam volna ide 'break 1;'-et is
}
print ("$ertek \n");
}
?>
Pldakdunkat itt (8/6 demo) lthatod mkds kzben.
A continue segtsgvel tugorhatjuk a ciklus aktulis lefutsnak htralev rszt, s a vgrehajtst a kvetkez lefutssal folytathatjuk.
A continue is elfogad egy elhagyhat szm paramtert, amely megadja, hogy hny egymsba gyazott struktrnak a htralv rszt kell tugrani. while (list ($kulcs, $ertek) = each ($tomb)) {
if (!($kulcs % 2)) { // a pros indexek kihagysa
continue;
}
valami_paratlan_dolog ($ertek);
}
?>
A break s a continue utn mindig ki kell tenni a ; pontosvessz lezrst. |