Käytännön PHP-opas

Kirjoittaja: Antti Laaksonen [antti.laaksonen@mbnet.fi]

Osa 3 - Komentorakenteet

Tämä PHP-oppaan kolmas osa keskittyy kielen tärkeimpiin komentorakenteisiin, joiden hallitseminen on tärkeimpiä asioista PHP-ohjelmoinnissa. Ehtolauseet siirtyvät eri koodiosuuksiin riippuen siitä, mitä arvoja muuttujille on asetettu. Silmukkarakenteet taas toistavat tiettyä asiaan useampaan kertaan.

Todet ja epätodet lauseet

Useimmat komentorakenteet perustuvat ehtoihin. Ehto on joko true (tosi) tai false (epätosi). Tyypillinen ehto on kahden muuttujan tai lausekkeen vertailu. PHP:n yleisimmät vertailuoperaattorit ovat:

merkintätarkoitus
$a == $b$a on yhtä kuin $b
$a != $b tai $a <> $b$a ei ole $b
$a > $b$a on suurempi kuin $b
$a < $b$a on pienempi kuin $b
$a >= $b$a on suurempi tai yhtä suuri kuin $b
$a <= $b$a on pienempi tai yhtä suuri kuin $b

Esimerkkejä tosista vertailulauseista.

Useampia ehtoja voi yhdistää loogisilla operaattoreilla. Loogisia operaattoreita voi ajatella kielellisinä ilmauksina ja, tai ja joko...tai sekä kieltoilmauksena. Loogiset operaattorit ovat:

merkintätarkoitus
$a and $b tai $a && $b$a ja $b ovat tosia
$a or $b tai $a || $b$a tai $b on tosi
$a xor $b$a tai $b on tosi, mutta eivät molemmat
! $a$a ei ole tosi

Seuraavassa on pari esimerkkiä loogisten operaattoreiden käytöstä. Ensimmäinen lause on tosi, koska 6 on suurempi kuin 5 ja 7 on yhtä kuin 7. Toinen lause on tosi, koska 6 on suurempi kuin 5, vaikka 6 ei olekaan yhtä kuin 5. Kolmas lause on tosi, sillä 5 ei ole suurempi kuin 7.

if-ehtolause

if-lause sisältää joukon ehtoja, joista kukin toteutuessaan suorittaa tietyn tai tietyt koodilausekkeet. Lauseen rakenne on seuraavanlainen, hakasuluilla merkityt osat eivät ole pakollisia.

if (ehto1)
   koodi1;
[elseif (ehto2)
   koodi2;]
...
[elseif (ehton)
   koodin;]
[else
   koodiv]

Jos ehto 1 on tosi, suoritetaan koodi 1. Jos ehto 2 on tosi, suoritetaan koodi 2. Näin jatketaan viimeiseen ehtoon n saakka. Jos mikään ehdoista ei ole tosi, suoritetaan koodi v. Jos ehdon jälkeen suoritettavia lausekkeita on useampia, ne on erotettava aaltosuluilla seuraavaan tapaan.

if (ehto) {
   koodirivi1;
   koodirivi2;
   koodirivi3;
}

Seuraava esimerkkiskripti tulostaa tietoa sen mukaan, mikä arvo muuttujalla on.

<?php
//skripti tulostaa tietoa hissin sijainnista sen kerroksen perusteella

$kerros = 2;

echo
"Hissi on ";

if (
$kerros < 0)
   echo
"maan alla.";
elseif (
$kerros == 0)
   echo
"katutasolla.";
elseif (
$kerros == 1)
   echo
"ensimmäisessä kerroksessa.";
elseif (
$kerros == 2 or $kerros == 3)
   echo
"toisessa tai kolmannessa kerroksessa.";
elseif (
$kerros > 3)
   echo
"yläkerroksissa.";
else
   echo
"jossain, missä sen ei pitäisi.";
?>

while-silmukat

while-silmukalla toistetaan samaa tapahtumaa niin kauan kun tietty ehto pysyy totena. Ehto tarkistetaan silmukan alussa, joten koodia ei välttämättä suoriteta kertaakaan. Silmukan rakenne muodostuu seuraavasti. Jos koodilausekkeita on useita, ne ympäröidään aaltosuluilla.

while (ehto)
   koodi;

while (ehto) {
   koodirivi1;
   koodirivi2;
   koodirivi3;
}

Hyvin samantapainen rakenne on do...while. Erona on se, että ehto tarkistetaan vasta silmukan lopussa. Tämän vuoksi silmukan koodi suoritetaan varmasti ainakin kerran.

do {
   koodirivi1;
   koodirivi2;
   koodirivi3;
} while (ehto);

Seuraava esimerkkiskripti listaa 2:n kertotaulua, kunnes lukujen summa on 500.

<?php
//tulostetaan 2:n kertotaulua siihen asti, kun lukujen summa on alle 500

$summa = 0;
$kerroin = 0;

//toistetaan niin kauan kuin summa on pienempi kuin 500
while ($summa < 500) {
   
$tulos = 2 * $kerroin; //lasketaan 2:n ja kertoimen tulo
   
echo "2 * $kerroin = $tulos. "; //tulostetaan tulo
   
$kerroin++; //korotetaan kerrointa yhdellä
   
$summa += $tulos; //lisätään summaan viimeisin tulos
}
?>

for-silmukat

Kehittyneempi silmukkarakenne on for, joka mahdollistaa lukusarjan läpikäynnin tietyillä ehdoilla. for on käyttökelpoinen silloin, kun tiedetään, että tietty asia täytyy tehdä niin ja niin monta kertaa. Silmukan rakenne on seuraava:

for (alustus; ehto; päivitys)
   koodi;

for (alustus; ehto; päivitys) {
   koodirivi1;
   koodirivi2;
   koodirivi3;
}

Alustus suoritetaan kerran silmukan alussa. Yleensä tällöin määritellään silmukassa käytettävälle "laskurimuuttujalle" aloitusarvo. Silmukkaa toistetaan niin kauan kuin ehto on tosi. Aina silmukan lopussa suoritetaan päivitys, joka tyypillisesti on laskurimuuttujan lisäys- tai vähennyslauseke.

Esimerkkiskripti laskee taulukon kaikki arvot yhteen for-silmukan avulla käyttäen $i-muuttujaa taulukon indeksinä. Koska taulukon indeksit alkavat nollasta, suurin indeksi on yhtä pienempi kuin indeksien lukumäärä.

<?php
//luodaan taulukko, lasketaan sen arvot yhteen ja tulostetaan summa

$taulu[]=5;
$taulu[]=12;
$taulu[]=3;
$taulu[]=8;

//aloitetaan 0:sta, toistetaan niin kauan kuin luku on taulukon
//indeksimäärää pienempi ja lisätään indeksiä joka kerta yhdellä
for ($i = 0; $i < count($taulu); $i++) {
   
$summa += $taulu[$i]; //lisätään summaan taulukon $i:s arvo
}

echo
"Yhteensä: $summa.";
?>

Hieman samanlaista käyttöä on foreach-rakenteella. Jos taulukon indeksit eivät ole numerojärjestyksessä, niiden läpikäyminen ei onnistu suoraan for-silmukalla. foreach käy läpi taulukon kunkin indeksin seuraavan esimerkin tapaan.

<?php
//luodaan taulukko maiden asukasluvuista ja tulostetaan sen sisältö

$maat = array("Belgia" => 10.3, "Norja" => 4.5, "Ruotsi" => 8.9, "Saksa" => 82.2);

foreach (
$maat as $nimi => $asukkaat) {
   echo
"{$nimi}ssa on $asukkaat miljoonaa asukasta. ";
   
$yht += $asukkaat;
}
echo
"Yhteensä näissä maissa on $yht miljoonaa asukasta.";
?>

Silmukan lopettaminen

Välillä tulee tilanteita, jolloin silmukka pitäisi lopettaa kesken. Tähän tarkoitukseen on olemassa komennot continue ja break. continue siirtyy silmukan loppuun ja aloittaa siten uuden kierroksen, break lopettaa silmukan kokonaan.

<?php
//esimerkki continue-komennon käytöstä:
//viimeisen rivi yli hypätään aina

for ($i = 0; $i < 10; $i++) {
   echo
"Tulostus $i. ";
   continue;
   echo
"Tätä ei tulosteta koskaan.";
}
?>

<?php
//esimerkki break-komennon käytöstä:
//jos muuttuja on suurempi kuin 5, silmukka lopetetaan kesken

for ($i = 0; $i < 10; $i++) {
   if (
$i > 5) break;
   echo
"Tulostus $i. ";
}
?>

Jos skriptissä on sisäkkäin useampia silmukoita, niitä voi lopettaa yhtä aikaa antamalla continuelle tai breakille lopetettavien kerrosten määrä parametrina.

<?php
//esimerkki useamman silmukan lopettamisesta:
//tulostetaan nousevia lukupareja 50 kappaletta

for ($i = 0; $i < 10; $i++) {
   for (
$j = 1; $j < 10; $j++) {
      echo
"Lukupari: $i/$j. ";
      
$sum++;
      if (
$sum > 50) break 2;
   }
}

?>

Loppusanat

Tämä opas alkaa olla lopussaan. Jätin komentorakenteista tietoisesti pois switch-rakenteen, jota käytetään joskus pitkien if-rakenteiden korvaamiseen. Tämä siksi, että lauseen rakenne on mielestäni PHP:ssä melko kankea, ja sille on vain harvoin oikeita käyttötilanteita. Halutessasi voit kuitenkin lukea tämänkin komentorakenteen käytöstä PHP:n manuaalista.

Nyt kun PHP:n perusteet alkavat olla selvillä, on aika yhdistää opitut taidot www-sivujen tekemiseen. Seuraavassa opassarjan osassa käsitellään aiheeseen liittyviä asioita, kuten sivupohjia ja lomakkeita. osa 4

Antti Laaksonen, 8.3.2003