Kirjautuminen

Haku

Tehtävät

Oppaat: PHP-ohjelmointi: Osa 8 - Lisää silmukoista

  1. Osa 1 - Johdanto
  2. Osa 2 - Muuttujat
  3. Osa 3 - if-rakenne
  4. Osa 4 - for-silmukka
  5. Osa 5 - Taulukot
  6. Osa 6 - Lomakkeet
  7. Osa 7 - Nettisivusto
  8. Osa 8 - Lisää silmukoista
  9. Osa 9 - Tiedostot
  10. Osa 10 - Omat funktiot
  11. Osa 11 - Istunnot
  12. Osa 12 - Tietokannat
  13. Osa 13 - Tietoturva
  14. Osa 14 - Olio-ohjelmointi
  15. Osa 15 - Kuvien luonti
  16. Osa 16 - Säännölliset lausekkeet
  17. Osa 17 - Merkistöt
  18. Osa 18 - PHP:n ongelmat

Kirjoittaja: Antti Laaksonen (2011).

PHP:ssä on for-silmukan lisäksi myös while-silmukka, johon tutustumme tässä oppaassa. Ideana while-silmukassa on, että silmukka jatkaa koodin toistamista niin kauan kuin haluttu ehto pitää paikkansa. Lisäksi opimme uusia asioita totuusarvoista ja silmukoista.

Tämän oppaan jälkeen olemme käyneet läpi PHP:n tärkeimmät ominaisuudet. Käsiteltyjä asioita soveltamalla voi jo toteuttaa hyvin monenlaista nettisivuille.

while-silmukka

while-silmukkaa käytetään seuraavasti:

while (ehto) {
    koodi
}

Silmukka toistaa koodia niin kauan kuin annettu ehto on voimassa. Silmukan ehto määritetään samaan tapaan kuin if-rakenteessa.

Esimerkiksi seuraava koodi tulostaa luvut 1–10:

<?php
$luku = 1;
while ($luku <= 10) {
    echo $luku . "<br>";
    $luku++;
}
?>

Yllä olevassa koodissa while-silmukkaa käytetään hyvin samaan tapaan kuin for-silmukkaa. Itse asiassa minkä tahansa for-silmukan voi korvata while-silmukalla ja päinvastoin. Yleensä kuitenkin jompikumpi silmukka sopii paremmin kulloiseenkin ohjelmointitilanteeseen.

Totuusarvot

Ehtorakenteessa ja while-silmukassa oleva ehto on joko tosi (true) tai epätosi (false). Tällaista ehtoa sanotaan totuusarvoksi tai boolean-arvoksi. Totuusarvoja voi tallentaa muuttujiin samaan tapaan kuin merkkijonoja ja lukuja. Esimerkiksi seuraavat koodia vastaavat toisiaan:

if ($salasana == "kissa") {
   echo "Oikein!";
}
$oikein = $salasana == "kissa";
if ($oikein) {
   echo "Oikein!";
}

Jälkimmäisessä koodissa muuttujan $oikein arvo on true, jos salasana on "kissa", ja false, jos salasana on jotain muuta. Tässä tapauksessa totuusarvon sijoittaminen muuttujaan ei tunnu kovin hyödylliseltä, mutta tulemme kohtaamaan tilanteita, joissa siitä on aitoa hyötyä.

break ja continue

Komennot break ja continue ovat usein hyödyllisiä silmukoissa. Komento break lopettaa silmukan, ja komento continue siirtyy silmukassa seuraavan kierroksen alkuun. Huomaa, että komentoja voi käyttää sekä for- että while-silmukoissa.

Seuraava koodi heittää noppaa, kunnes tulee luku 6:

<?php
while (true) {
    $noppa = rand(1, 6);
    echo $noppa . "<br>";
    if ($noppa == 6) {
        break;
    }
}
?>

Koodin tulostus voi olla esimerkiksi seuraava:

4
2
4
3
3
6

Tässä while-silmukan ehtona on true, mikä tarkoittaa, että silmukka jatkuu periaatteessa loputtomasti. Kuitenkin silmukan sisällä oleva break-komento keskeyttää sen, jos nopan silmäluku on 6.

Seuraava koodi tulostaa kaikki parittomat luvut väliltä 1–100:

<?php
for ($i = 1; $i <= 100; $i++) {
    if ($i % 2 == 0) {
        continue;
    }
    echo $i . " ";
}
?>

Koodin tulostus on seuraava:

1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99

Silmukassa oleva koodi tarkistaa, onko luku $i parillinen, ja siirtyy siinä tapauksessa heti silmukan seuraavalle kierrokselle continue-komennolla. Niinpä koodi tulostaa vain luvut, jotka ovat parittomia.

Esimerkki: Lottoarvonta

Seuraava koodi arpoo lottorivin eli 7 eri numeroa väliltä 1–39:

<?php
$oikeat = array();
while (count($oikeat) < 7) {
    $numero = rand(1, 39);
    if (in_array($numero, $oikeat)) {
        continue;
    }
    $oikeat[] = $numero;
}
sort($oikeat);
echo "Oikeat numerot: " . implode(", ", $oikeat);
?>

Koodin tulostus voi olla seuraava:

Oikeat numerot: 2, 4, 9, 21, 24, 32, 37

Koodissa on ideana arpoa numeroita yksi kerrallaan taulukkoon $oikeat. Silmukka jatkuu niin kauan kuin taulukossa on alle 7 numeroa. Funktio in_array tarkistaa, onko arvottu numero taulukossa valmiiksi. Jos numero on taulukossa, siirrytään uudelle silmukan kierrokselle continue-komennolla. Muuten arvottu luku lisätään taulukkoon.

Numeroiden arpomisen jälkeen taulukon sisältö järjestetään pienimmästä suurimpaan sort-funktiolla. Tämän jälkeen numerot tulostetaan pilkuilla erotettuina implode-funktion avulla. Funktio yhdistää taulukon alkiot merkkijonoksi annettua välimerkkiä käyttäen.

Tässä on vielä toinen lähestymistapa tehtävään:

<?php
$numerot = range(1, 39);
shuffle($numerot);
$oikeat = array_slice($numerot, 0, 7);
sort($oikeat);
echo "Oikeat numerot: " . implode(", ", $oikeat);
?>

Nyt funktio range luo taulukon, joka sisältää numerot 1–39. Sitten funktio shuffle sekoittaa taulukon sisällön ja funktio array_slice poimii sen 7 ensimmäistä numeroa taulukkoon $oikeat. Tämän jälkeen riittää järjestää ja tulostaa taulukon $oikeat sisältö.

Ohjelmointitaito

Ohjelmointitaitoon kuuluu kaksi asiaa:

  1. ohjelmoinnin perusasioiden hallinta
  2. kyky etsiä itsenäisesti tietoa

PHP-ohjelmoinnissa perusasioita ovat muuttujat, if-rakenne, silmukat ja taulukot. Nämä asiat on syytä muistaa ja ymmärtää hyvin, koska niitä tarvitsee jokaisessa muutamaa riviä pidemmässä PHP-koodissa.

PHP:ssä on valmiina suuri määrä hyödyllisiä funktioita esimerkiksi merkkijonojen ja taulukkojen käsittelyyn. Näitä funktioita ei tarvitse opetella ulkoa, koska niiden toiminnan voi aina tarkistaa PHP:n manuaalista. Jos tietää suurin piirtein, mitä on hakemassa, tarvittava funktio löytyy yleensä manuaalista nopeasti.

Käytännössä useimmin tarvittavat funktiot, kuten taulukon pituuden laskevan funktion count, oppii ulkoa nopeasti, mutta harvinaisen funktion käyttötavan tarkistaminen PHP:n manuaalista on arkipäivää kokeneellekin PHP-ohjelmoijalle.

PHP-haaste

Ohjelmointiputkan PHP-haaste sisältää 100 tehtävää, jotka opettavat ohjelmoinnin perusasioiden soveltamista. Kannattaa tarttua haasteeseen!


Kirjoita kommentti

Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta