TOISTOLAUSEET (silmukat eli loopit)

PHP-kielessä ohjelmalauseet suoritetaan normaalisti vain kerran. Tämä ei aina ole kovin joustava eikä käytännöllinen ratkaisu, jos ohjelmalausetta joudutaan suorittamaan useamman kerran. Tällaisia tapauksia varten kieleen on rakennettu toistolauseet, eli silmukkarakenteet, eli loopit, joiden avulla ohjelmalausetta toistetaan niin kauan kunnes tietty ehto on täytetty.

PHP:ssä on käytössä seuraavat toistolauseet: for, foreach, while ja do...while.


for - rakenne

for-komentoa käytetään tilanteissa, joissa halutaan suorittaa jotakin tehtävää tietty kertamäärä.

for-komennon yleinen muoto:

for (alustus; ehto; päivitys) { lause; }

Avainsanan for jälkeen tulevissa suluissa on kolme osaa:
Alustus on toiminto jolla silmukkaa ohjaava muuttuja alustetaan, eli alustetaan laskuri jonka avulla toistojen määrää kontrolloidaan.
Ehto-osa on aina TOSI tai EPÄTOSI. Ehto-osan ollessa TOSI voidaan silmukan suoritusta jatkaa, ehto-osaa voidaan pitää myös lopetusehtona.
Päivitys-osassa suoritetaan uudet arvottamiset esim. lisätään silmukan laskuria.

Osista jokin tai kaikki voivat puuttua mutta puolipisteet on laitettava sulkujen sisälle.

for on aloitusehtoinen komento, joka tarkoittaa, että ehto testataan ennen silmukkaan menoa.

Alla oleva esimerkki näyttää numerot yhdestä kymmeneen.

/* for-esimerkki */ <!DOCTYPE HTML> <html lang="en"> <html> <head> <meta charset="UTF-8"> <title>TESTISIVU</title> </head> <body> <?php for ($kertaa = 0; $kertaa <= 10; $kertaa++) { echo "Numero on: $kertaa <br> "; } ?> </body> </html>


Numero on: 0
Numero on: 1
Numero on: 2
Numero on: 3
Numero on: 4
Numero on: 5
Numero on: 6
Numero on: 7
Numero on: 8
Numero on: 9
Numero on: 10



Tehtävä 1 Kirjoita toistolause, joka näyttää numerot kymmenestä yhteen.




/* lasketaan sataan kymmenen välein */ <?php for ($luku = 0; $luku <= 100; $luku = $luku + 10) { echo "Luku on: $luku <br>"; } ?>


Luku on: 0
Luku on: 10
Luku on: 20
Luku on: 30
Luku on: 40
Luku on: 50
Luku on: 60
Luku on: 70
Luku on: 80
Luku on: 90
Luku on: 100



Tehtävä 2 Kirjoita toistolause, missä lasketaan tuhanteen sadan välein.




Alla, ohjelma jossa sijoitetaan yksiuloitteiseen taulukkoon 10 desimaalilukua ja tulostetaan annetut luvut taulukosta näytölle.

/* for-esimerkki, kymmenen lukua taulukkoon ja niiden tulostus */ <?php $luvut = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); $taulukoko = count($luvut); for($sarake = 0; $sarake < $taulukoko; $sarake++) { echo $luvut[$sarake]; echo ,"<br>"; } ?>


1
2
3
4
5
6
7
8
9
10



Tehtävä 3 Kirjoita taulukko-ohjelma, joka tulostaa suomenkielen aakkoset järjestyksessä.




Alla, sisäkkäisistä for-lauseista esimerkki. Sisäkkäisellä for-lauseella voi käsitellä esim. kaksi-uloitteista taulukkoa.

Ulompi for-lause (punainen) hoitaa rivin vaihtamisen ja sisempi for-lause (sininen) tulostuksen riville, taulukon ollessa kyseessä tulostaisi sarakkeissa olevan tiedon.

/* sisäkkäiset for-lauseet */ <?php for ($rivi = 1; $rivi <= 10; $rivi++){ for ($sarake = 1; $sarake <= 10; $sarake++){ echo " _ "; } echo "<br>"; } ?>


_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _




Suuren taulukoiden sisällön esittämiseen www-sivuille on lyhin koodi saadaan käyttämällä for-lauseita. Alla, tulostetaan taulukon sisältö sisäkkäisten for-lauseiden avulla.

/* sisäkkäiset for-lauseet */ <?php $taulu = array ( array("1.rivi:","A","B","C","D","E"), array("2.rivi:","F","G","H","I","J"), array("3.rivi:","K","L","M","N","O"), array("4.rivi:","P","Q","R","S","T"), array("5.rivi:","U","V","W","Y","Y") ); for ($rivi = 0; $rivi <= count($taulu); $rivi++) { for ($sarake = 0; $sarake <= 6; $sarake++){ echo " ". $taulu[$rivi][$sarake] ." "; } echo "<br>"; } ?>


1.rivi: A B C D E
2.rivi: F G H I J
3.rivi: K L M N O
4.rivi: P Q R S T
5.rivi: U V W Y Y



Tehtävä 4 Muokkaa yllä olevasta esimerkistä 4 * 7 taulukko. (4 riviä, 7 saraketta) Sijoita taulukkoon seuraavat: Nimi Koe 1 Koe 2 Koe 3 Koe 4 Yht. Arvosana Ykkönen Alli 30 40 50 60 0 0 Kakkonen Bertta 40 50 60 70 0 0 Kolmonen Carita 50 60 70 80 0 0 Näytä taulukon sisältö for-lauseiden avulla.




foreach - rakenne

foreach-rakenne tarjoaa helpon tavan toistaa taulukot.
Ainoastaan taulukot ja objektit toimivat foreach-rakenteen kanssa; yrittäessä käyttää sitä muun datan kanssa ohjelma antaa error-koodin.

Alla, foreach-komentosta esimerkki.

/* Taulukon sisällön näyttäminen foreach-rakenteella */ <?php $värit = array("Punainen", "Vihreä", "Sininen", "Keltainen"); foreach ($värit as $kaikki) { echo "$kaikki <br>"; } ?>

Punainen
Vihreä
Sininen
Keltainen



Seuraavassa esimerkissä on taulukossa solujen niminä kolmen henkilön etunimet ja varsinaisena sisältönä henkilöiden iät.

Taulukon sisältö näytetään ikäjärjestyksessä nuorimmasta vanhimpaan järjestyksessä nimi ja ikä. Huomaa kuinka taulukon sisällön järjestys muuttui.

<?php $ika = array("Arto"=>"24", "Esko"=>"21", "Heikki"=>"22"); asort($ika); foreach($ika as $sarake => $sarake_alue) { echo "Nimi - " . $sarake . ", Ikä - " . $sarake_alue; echo "<br>"; } ?>


Nimi - Esko, Ikä - 21
Nimi - Heikki, Ikä - 22
Nimi - Arto, Ikä - 24


Kysymys: Mikä tieto on muuttujissa sarake ja sarake_alue ?


while - rakenne

PHP-kielen kolmas silmukkarakenne on while-rakenne. while-silmukassa silmukan runko suoritetaan niin kauan kuin ehto on tosi. Kun ehto tulee epätodeksi, ohjelman suoritus siirtyy silmukkaa seuraavaan lauseeseen. while on alku-ehtoinen toistolause, eli ensin tutkitaan toteutuuko ehto ennenkuin rakenteen sisään mennään.

while -komennon yleinen muoto:

while (ehto on totta) { ohjelmalause; }


Alla, while-komentoa käytetään toistolauseena.

/* Teksti ja numero 1:stä 5:teen while-lauseella */ <?php $numero = 1; while($numero <= 5) { echo "Numero on: $numero <br>"; $numero++; } ?>


Numero on: 1
Numero on: 2
Numero on: 3
Numero on: 4
Numero on: 5



Tehtävä 5 Muuta esimerkin while-silmukkarakenne, näyttämään numerot kymmenestä yhteen.




do ... while - rakenne

do...while-silmukan rakenne on samantyyppinen kuin while-silmukan. do...while-rakenteen ero while ja for rakenteeseen on, että se on lopetusehtoinen. do...while-silmukka suoritetaan aina vähintään yhden kerran, koska ehto testataan silmukan lopussa eikä sen alussa.

do...while-silmukan yleinen muoto:

do { ohjelmalause; } while (lopetus-ehto);



/* Kymmenen naulaa do...while lauseella */ <?php $naula = 1; do { echo "Lyö $naula. naula, lyöty. <br>"; $naula++; } while ($naula <= 10); ?>


Lyö 1. naula, lyöty.
Lyö 2. naula, lyöty.
Lyö 3. naula, lyöty.
Lyö 4. naula, lyöty.
Lyö 5. naula, lyöty.
Lyö 6. naula, lyöty.
Lyö 7. naula, lyöty.
Lyö 8. naula, lyöty.
Lyö 9. naula, lyöty.
Lyö 10. naula, lyöty.




do...while-silmukka on yleisin rakenne toteutettaessa koodin lopetus-ehto.

/* do...while käyttö taulukon tulostamiseen */ <?php $sarake = 0; $valmistaja = array("Sony","Apple","Samsung","Huawei","Panasonic"); do { echo $valmistaja[$sarake] . "<br>"; $sarake++; } while ($sarake < 5); ?>


Sony
Apple
Samsung
Huawei
Panasonic


Tehtävä 6 Kokeile pystyykö sisäkkäisillä do...while:lla tulostamaan kaksiulotteisen taulukon.




goto - komento

PHP-kieli sisältää myös goto -komennon, tosin sen käyttöä ei suositella koska se johtaa usein sekaviin kooditoteutuksiin.

break - KOMENTO

break-komennon ensisijainen käyttö on keskeyttää silmukan suoritus. Kun kääntäjä havaitsee break-komennon silmukan sisäpuolella, silmukan ajo keskeytetään kokonaan. break-komennolla voidaan esimerkiksi keskeyttää ohjelmarakenteen suorittaminen liian suuren numero-arvon syntyessä suorituksen aikana

Alla esimerkki break-komennon käytöstä. Jos numero-muuttuja on suurempi kuin 5, silmukka lopetetaan kesken.

/* break komento keskeyttää ohjelmarakenteen */ <?php for ($numero = 1; $numero <= 10; $numero++) { if ($numero > 5) break; echo "Numero on $numero. <br>"; } ?>


Numero on 1.
Numero on 2.
Numero on 3.
Numero on 4.
Numero on 5.





continue - komento

continue -komentoa käytetään ohittamaan silmukan loppuosa. Komentoa käytetään kuten break komentoa, mutta komennon käyttö ei johda silmukan keskeyttämiseen vaan silmukan suoritusta jatketaan silmukan alusta.

/* estetään continue:n alla olevantekstin näyttäminen */ <?php for ($numero = 0; $numero <= 10; $numero++) { echo "Näytetään numero $numero. <br>"; continue; echo "Tätä ei näytetä koskaan. <br>"; } ?>


Näytetään numero 0.
Näytetään numero 1.
Näytetään numero 2.
Näytetään numero 3.
Näytetään numero 4.
Näytetään numero 5.
Näytetään numero 6.
Näytetään numero 7.
Näytetään numero 8.
Näytetään numero 9.
Näytetään numero 10.



Tehtävä 7 Muokkaa ylläoleva koodi siten, että - teksti "Tämä näkyy" tulostuu tekstin "Näytetään numero X" alle kun numero on 0 - 4 sekä kun numero on 8 - 10