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 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:
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ä.
Seuraavassa taulukossa on lisää esimerkkejä for-silmukoista:
silmukka | tulostus |
---|---|
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 | |
10 9 8 7 6 5 4 3 2 1 | |
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.
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>"; } ?>
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>"; } ?>
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 \"
.
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>"; ?>
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.
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.