A ciklusosan ismétlődő műveletek hatékonyságát láttuk az előző leckék során. Mi történik olyan esetben, ha valamiért meg kell szakítani a ciklust még mielőtt az természetes módon véget érne, esetleg át kell ugorni a ciklus belsejében levő kód egy részét? Ezekre az esetekre alkalmazhatjuk a break (vele már találkoztunk korábban), a continue és a goto utasításokat.
A break csak cikluson belül használható, és a for, foreach, while, do .. while és switch szerkezetek futását szakítja meg. Az utasítás számot fogad el argumentumként: ha meg van adva, akkor ez a szám határozza meg, hogy az egymásba ágyazott ciklusokból milyen szintig kell kitörni. Az alábbi példa ezt szemlélteti:
--------------------
<?php
for ($i = 0; $i < 10; $i++) { //3. szint
for ($j = 0; $j < 10; $j++) { //2. szint
for ($z = 0; $z < 100; $z++) { //1. szint
if ($z > 10) {
break 2; //2. szintre tör ki
}
echo "i: $i, j: $j, z: $z\n";
}
}
}
?>
--------------------
A fenti példában látott 2. szintről való kitörés azt jelenti, hogy valójában a $j értéke sose lesz 0-nál nagyobb, mivel minden körben, amikor elkezdődik a ciklus, a benne levő $z változó értéke, amint eléri a 11-et, visszaugrik a 3. szintre. Ezzel együtt az 1. szint $z értékét sose fogjuk 10 fölött látni kiírva.
Argumentum nélkül csak az aktuális ciklusból tör ki a programunk: ezért a break; kifejezés egyenértékűnek tekinthető a break 1; kifejezéssel.
A continue utasítást olyankor használjuk, amikor a ciklusban levő, a contiue utasítás után következő kódrészletet át akarjuk ugrani:
--------------------
<?php
echo "Páros számok listája:\n";
for ($i = 0; $i <= 10; $i++) {
if (($i % 2) === 1) { // Ha van maradék, akkor páratlan,
continue; // ezért átugorjuk a többi részt.
}
echo "$i\n"; // Kiírjuk a páros számot.
}
?>
--------------------
A continue utasítás ugyanúgy elfogad szám argumentumot, mint a break - a működése is azonos: a számérték határozza meg a folyatás szintjét.
A goto ismerős lehet a 35+ korosztálynak, akik még aktívan programoztak valamely BASIC nyelvben. A logikája egyszerűnek tűnik: ugorjunk egy adott nevű címkéhez a kódban, amely címkét cimke: formában adunk meg. Van azonban jó pár megkötése a goto utasításnak: nem ugorhatunk ciklusba vagy függvénybe, csak ugyanazon fájlban levő címkére hivatkozhatunk, valamint nem ugorhatunk ki függvényből. A ciklusokból való kiugrási módszerként azonban alkalmazható. A legegyszerűbb példán keresztül szemléltetjük a goto működését:
--------------------
<?php
goto cimke; // >------->----->---+
echo 'Ezt sose fogod látni!'; // | Ezt a részt átugorjuk...
cimke: // <------<------<------+ Ugrás ide!
echo 'Ezt viszont igen!';
?>
--------------------
Ciklusból való kiugrásra példa:
--------------------
<?php
for ($i = 0; $i < 100; $i++) {
if ($i > 10) { //Ha meghaladja a 10-et...
goto cimke; //ugrás a címkéhez!
}
echo "$i\n";
}
cimke:
echo 'Az $i értéke elérte a 10-et!';
?>
--------------------
Figyelem!
A kódban nem csak lefele, hanem visszafele is lehet ugrani, így nem nehéz végtelen ciklust létrehozni:
--------------------
<?php
eleje:
echo 'Eleje';
goto vege;
echo 'Közepe, amit sose írunk ki.';
vege:
echo 'Vége';
goto eleje;
?>
--------------------
-----------------------------------------------------------------------------------------------------
Feladatok
1. Hozzunk létre egy ciklust, amely elszámol 100-ig, majd break segítségével ugorjunk ki a ciklusból, ha a változó értéke nagyobb, mint 50!
2. Ágyazzunk egymásba 3 ciklust, és próbáljuk ki, mi történik, ha break utasítást használunk argumentummal, majd írjuk át úgy, hogy a helyére continue kerüljön. Mit tapasztaltunk?
3. Goto segítségével próbáljuk ki a címkékhez ugrást tetszőleges kódon.