Kirjautuminen

Haku

Tehtävät

Oppaat: PHP-ohjelmointi: Osa 4 - for-silmukka

  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).

Silmukan tehtävänä on toistaa samaa koodia monta kertaa. PHP:ssä on kaksi erilaista silmukkaa: for-silmukka ja while-silmukka. Tässä oppaassa tutustumme for-silmukkaan, jolle on enemmän käyttöä käytännön ohjelmoinnissa. Opassarjan osa 8 esittelee while-silmukan ja sisältää lisätietoa silmukoiden käytöstä.

Tavallisin for-silmukan käyttötarkoitus on käydä läpi tietyllä lukuvälillä olevat luvut. Soveltamalla for-silmukkaa voimme esimerkiksi tulostaa saman tekstin halutun määrän kertoja tai käydä läpi kaikki merkkijonon merkit.

for-silmukka

for-silmukka käy läpi luvut tietyltä lukuväliltä. Silmukan muoto on seuraava:

for (aloitus; ehto; muutos) {
    koodi
}

Käytännössä kohta aloitus kertoo, mistä luvusta läpikäynti alkaa, kohta lopetus kertoo, mihin lukuun läpikäynti päättyy, ja kohta muutos kertoo, miten luku kasvaa tai vähenee läpikäynnissä. Jokaisen luvun kohdalla suoritetaan silmukan sisällä oleva koodi.

Esimerkiksi seuraava koodi tulostaa luvut 1–5:

for ($i = 1; $i <= 5; $i++) {
    echo $i . " ";
}

Koodin tulostus on seuraava:

1 2 3 4 5

Muuttujassa $i on vuorollaan jokainen käsiteltävä luku. Silmukan aluksi muuttuja $i saa arvon 1. Silmukka jatkuu niin kauan kuin ehto $i <= 5 pätee eli $i on korkeintaan 5. Merkintä $i++ tarkoittaa, että muuttujan $i arvo kasvaa yhdellä silmukan kierrosten välillä.

Esimerkkejä

Seuraavassa taulukossa on lisää esimerkkejä for-silmukoista:

silmukkatulostus
for ($i = 1; $i <= 10; $i++) {
    echo $i . " ";
}
1 2 3 4 5 6 7 8 9 10
for ($i = 1; $i < 10; $i++) {
    echo $i . " ";
}
1 2 3 4 5 6 7 8 9
for ($i = 10; $i >= 1; $i--) {
    echo $i . " ";
}
10 9 8 7 6 5 4 3 2 1
for ($i = 10; $i > 1; $i--) {
    echo $i . " ";
}
10 9 8 7 6 5 4 3 2

Huomaa ero merkintöjen < ja <= sekä merkintöjen > ja >= välillä. Jos vertailussa on mukana yhtäsuuruus, myös viimeinen luku tulee mukaan silmukkaan. Tilanteesta riippuu, kumpi merkintä on kätevämpi.

Esimerkki: Viestin toistaminen

Seuraava esimerkki kysyy käyttäjältä viestin ja toistokertojen määrän. Sitten koodi tulostaa viestin sivulle annetun määrän kertoja.

<!DOCTYPE html>
<html>
  <head>
    <title>Viestin toistaminen</title>
  </head>
  <body>
    <form action="viestintoisto.php" method="post">
      Mitä haluat sanoa? <input type="text" name="viesti"> <br>
      Kuinka monta kertaa? <input type="text" name="maara"> <br>
      <input type="submit" value="Lähetä">
    </form>
  </body>
</html>

Toistaminen tapahtuu for-silmukalla, jonka ylärajan on muuttujan $maara arvo. Esimerkiksi jos $maara on 5, silmukka käy läpi luvut 0, 1, 2, 3 ja 4. Tässä muuttujaa $i ei käytetä mitenkään silmukan sisällä, vaan sen ainoa tarkoitus on pitää kirjaa toistojen määrästä. Huomaa myös funktio htmlspecialchars, joka estää viestissä olevan HTML:n.

<?php
$viesti = $_POST["viesti"];
$maara = $_POST["maara"];
for ($i = 0; $i < $maara; $i++) {
    echo htmlspecialchars($viesti) . "<br>";
}
?>

Kokeile koodia

Esimerkki: Värikäs nimi

Seuraava esimerkki tulostaa käyttäjän nimen värikkäästi:

<!DOCTYPE html>
<html>
  <head>
    <title>Värikäs nimi</title>
  </head>
  <body>
    <form action="varikasnimi.php" method="post">
      Mikä on nimesi? <input type="text" name="nimi"> <br>
      <input type="submit" value="Lähetä">
    </form>
  </body>
</html>

PHP-koodi käy nimen läpi merkki kerrallaan ja tulostaa joka toisen kirjaimen sinisellä ja joka toisen kirjaimen punaisella:

<?php
$nimi = $_POST["nimi"];
for ($i = 0; $i < strlen($nimi); $i++) {
    if ($i % 2 == 0) {
        $vari = "blue";
    } else {
        $vari = "red";
    }
    $merkki = $nimi[$i];
    echo "<span style=\"color:{$vari}\">{$merkki}</span>";
}
?>

Kokeile koodia

Koodi sisältää melko paljon uusia asioita:

Merkintä $i % 2 tarkoittaa luvun $i jakojäännöstä 2:lla. Käytännössä koodi tutkii, onko luku parillinen vai pariton, koska parillisen luvun jakojäännös 2:lla on 0 ja parittoman luvun jakojäännös 2:lla on 1. Tässä tapauksessa väri on sininen, jos luku on parillinen, ja punainen, jos luku on pariton.

Merkintä $nimi[$i] hakee merkkijonosta kohdassa $i olevan merkin. Merkkijonon merkit on numeroitu niin, että ensimmäisen merkin kohta on 0, toisen merkin kohta on 1 jne. Esimerkiksi jos $nimi on "Pekka", niin $nimi[0] on "P", $nimi[1] on "e" jne.

Huomaa myös lainausmerkkien merkintätapa merkkijonossa. Lainausmerkkejä ei voi kirjoittaa sellaisenaan, koska ne sekoittuisivat merkkijonon lopetusmerkkiin. Ratkaisu on kirjoittaa lainausmerkit muodossa \".

Esimerkki: Kertotaulu

Seuraava koodi tulostaa 20x20-kertotaulun:

<?php
echo "<table border>";
for ($i = 1; $i <= 20; $i++) {
    echo "<tr>";
    for ($j = 1; $j <= 20; $j++) {
        echo "<td>" . ($i * $j) . "</td>";
    }
    echo "</tr>";
}
echo "</table>";
?>

Kokeile koodia

Koodissa on kaksi sisäkkäistä for-silmukkaa, joista ensimmäinen käy läpi luvut 1–20 muuttujassa $i ja toinen käy jokaisen luvun $i kohdalla läpi luvut 1–20 muuttujassa $j. Käytännössä muuttuja $i huolehtii kertotaulun riveistä ja muuttuja $j huolehtii kertotaulun sarakkeista.

Jokaisen kertotaulun rivin alussa koodi tulostaa tagin <tr>, joka aloittaa taulukon rivin. Sitten koodi tulostaa kaikki riville tulevat luvut tagien <td> ja </td> sisälle. Lopuksi koodi tulostaa tagin </tr>, joka lopettaa taulukon rivin.


Kommentit

teemonkey [31.01.2018 00:39:28]

#

Kiva kun esimerkeissä käytetty värit ja kirjaimet

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