PHPPamokos.lt


7. Ciklai: WHILE, FOR ir FOREACH

Pradėkime iš toli. Kompiuteriai iš esmės buvo sukurti tam, kad galėtų atlikti sudėtingas ir pasikartojančias skaičiavimo operacijas, kurios žmogui sugaištų per daug laiko. Nuo tada praėjo daug laiko, bet poreikis atlikti cikliškus veiksmus išliko, ir ciklai yra viena iš pagrindinių bet kokios programavimo kalbos konstrukcijų. Pažvelkime, kaip jie atrodo PHP kalboje.

Ciklai kažkuo panašūs į sąlygos sakinius, kuriuos aptarėme praeitame skyrelyje. Tik skirtumas toks, kad ten JEIGU [tenkinama sąlyga], TAI [vykdomas veiksmas], o ciklų atveju yra kitaip: KOL [tenkinama sąlyga], TOL [vykdomas veiksmas]. Tokiu būdu veiksmas atliekamas N kartų - tiek, kiek jums reikia arba iki tol, kol sąlyga nebebus patenkinama. PHP kalboje praktiškai yra keturi ciklai: WHILE, atvirkščias DO .. WHILE, tada FOR ir FOREACH. Apžvelgsime kiekvieną iš jų atskirai.

Ciklas WHILE

Šis variantas tiesiogiai atitinka aukščiau išdėstytą atvejį:

KOL [tenkinama sąlyga], TOL [vykdomas veiksmas].

Schematiškai tai atrodo taip:

while (TENKINAMA SĄLYGA) {
  // atliekami veiksmai
}

Paprastas pavyzdys:

$hour = 0;
while ($hour <= 24) {
  echo $hour . "-a valanda<br />";
  $hour = $hour + 1;
}

Paprastai kalbant, šis ciklas atlieka štai ką: KOL valandos yra mažiau arba lygu už 24, TOL išvedame į ekraną valandų skaičių ir pridedame prie valandos vienetą. Po kiekvieno veiksmų bloko { } įvykdymo yra tikrinama ciklo sąlyga, ir jei ji vis dar teisinga, tada vėl grįžtama prie veiksmų bloko vykdymo, o jeigu neteisinga, tai ciklo darbas baigiamas.

Kaip jau galbūt supratote, ciklo viduje veiksmų bloke jūs turite atlikti kažką, kas pakeičia ciklo sąlygos teisingumą. Priešingu atveju ciklas gali niekada nesibaigs, operacijos bus atliekamos neribotą laiką, o tai labai negerai, šis reiškinys vadinamas "amžinu ciklu".

Web-serveryje yra dažniausiai nustatytas skripto vykdymo laiko ribojimas, kuris daugeliu atvejų yra lygus 30 sekundžių. Tad jeigu taip atsitiks, kad jūs parašysite "amžiną ciklą", tada po 30 sekundžių naršyklės lange pasirodys pasirodys klaidos tekstas panašus į "Maximum execution time exceeded".

Dar atskirai reikia paminėti matematinius operatorius ++ ir -- (du pliusai ir du minusai). Jie dažnai naudojami cikluose ir veikia kaip sutrumpinimai operacijoms "pridėti vienetą" ir "atimti vienetą". Aukščiau cikle parašytas sakinys gali būti sutrumpintas taip:

$hour++; // tai yra tas pats, kas $hour = $hour + 1;
 

Atvirkščias ciklas DO .. WHILE

Tas pats ciklas gali būti naudojamas atvirkščiai - sąlyga gali būti ne pradžioje ciklo, o jo pabaigoje.

Schematiškai:

do {
  // atliekami veiksmai
} while (TENKINAMA SĄLYGA);

Tas pats viršutinis pavyzdys:

$hour = 0;
do {
  echo $hour . "-a valanda<br />";
  $hour = $hour + 1;
} while ($hour <= 24);

Jeigu jums teko programuoti su PASCAL kalba, tai ciklas DO.. WHILE yra kažkiek panašus į Pascal kalbos ciklą REPEAT .. UNTIL.

 

Ciklas FOR

Be ciklo WHILE, yra ir kitokio tipo ciklas FOR. Jis truputį sudėtingesnis ir reikalingas kitaip apibrėžiant ciklo sąlygas. Schematiškai jo užrašymas yra toks:

for ([PRADžIOS SĄLYGA]; [PRATĘSIMO SĄLYGA]; [ITERACIJOS VEIKSMAS]) {
  // atliekami veiksmai
}

Atrodo sudėtingai, bet pažiūrėkime į pavyzdį.

Sakykime, reikia pavaizduoti pasirinkimo "dropdown" lauką, kuriame pateikiami variantai nuo 1 iki 100. Tada kodas atrodo taip:

echo "<select name='pasirinkimas'>";
for ($i=1; $i <= 100; $i++) {
  echo "<option value=$i>$i</option>";
}
echo "</select>";

FOR ciklas susidaro iš trijų dalių: pradinės sąlygos, ciklo pratęsimo sąlygos bei veiksmo po kiekvienos iteracijos.

Šiame pavyzdyje pradinė sąlyga yra, kad $i=1, ir po kiekvienos iteracijos daroma $i++. O ar pratęsti ciklą toliau, tikrina sąlyga $i <= 100.

Jeigu konkrečiau, tai pradžioje kintamajam priskiriama reikšmė 1, tada įvykdomas ciklo veiksmas (echo), tada pridedamas vienetas ir tikrinama, ar reikšmė mažesnė už 100. Jei taip, tai tada veiksmai kartojami. Iki tol, kol nebus tenkinama sąlyga $i <= 100 arba, ūkiškai tariant, kai $i taps 101 ar daugiau.

 

Ciklas FOREACH

Taip pat yra sukurtas ciklas FOREACH, skirtas palengvinti darbą su masyvais. Kadangi masyvus aptarinėsime kitame skyrelyje, tai čia tik paminėsiu šio ciklo užrašymo būdą schematiškai. Yra du būdai:

foreach (MASYVAS as MASYVO_ELEMENTAS) {
  // atliekami veiksmai su masyvo elementu
}

arba

foreach (MASYVAS as RAKTAS => REIKŠMĖ) {
  // atliekami veiksmai su raktu ir/arba reikšme
}

Prie šio ciklo detaliau grįšime, nagrinėdami masyvus.

 

Ciklai cikluose

Jei žiūrėjote filmą "Inception", tai čia jums atrodys kažkiek panašu. Praeitoje pamokoje mokėmės IF sakinius, o šioje pamokoje - ciklus. Tai vienas iš privalumų, kad galima vienus rašyti viduje kitų. Viduje FOR ciklo gali būti kitas FOR ciklas, jo viduje gali būti IF sakinys ir pan.

Štai pavyzdys:

for ($i=1; $i <= 10; $i++) {
  for ($j=1; $j <= 5; $j++) {
    if ($i > 5 && $j > 2) echo $i . " - " . $j;
  }
}

Šiame pavyzdyje ciklas suksis iš viso 50 kartų. 10 kartų pagrindinis ciklas su $i kintamuoju, ir kiekvienas iš jų po 5 kartus su vidiniu $j kintamuoju. Ir kiekvieną kartą viduje bus tikrinama kintamųjų reikšmė ir pagal tai galbūt išvedamas tekstas.



(c) 2015-2018. Visais klausimais kreipkitės povilas@laraveldaily.com