Kirjautuminen

Haku

Tehtävät

Opasarkisto: PHP 4 -opas: Osa 3 - Komentorakenteet

  1. Osa 1 - Johdanto
  2. Osa 2 - Muuttujat ja taulukot
  3. Osa 3 - Komentorakenteet
  4. Osa 4 - PHP ja Internet-sivut
  5. Osa 5 - Tiedostojen käsittely
  6. Osa 6 - Funktiot
  7. Osa 7 - Evästeet ja istunnot
  8. Osa 8 - Tietokannat (MySQL)
  9. Osa 9 - Vinkkejä ja vihjeitä

Kirjoittaja: Antti Laaksonen (2003).

⚠ Huomio! Tämä opas on vanhentunut. Oppaan sisältöön ei voi enää luottaa. Opas on säilytetty vain sen historiallisen arvon vuoksi. ⚠


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" ja "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$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 jokainen toteutuessaan suorittaa tietyn tai tietyt ohjelmalauseet. Ehtolauseen 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, jonka avulla voi käydä läpi tietyn lukusarjan. 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 break ja continue. break lopettaa silmukan kokonaan, ja continue siirtyy silmukan loppuun ja aloittaa sitten uuden kierroksen.

<?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 breakille tai continuelle lopetettavien kerrosten määrä.

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

Antti Laaksonen, 8.3.2003


Kommentit

Gwaur [08.03.2003 17:05:52]

#

Aika hauska toi "missä sen ei pitäisi" :D

Antti Laaksonen [09.03.2003 12:09:13]

#

En kyllä muistaakseni niin ole sanonut. Oppaaseen neljä olen kyllä lupaillut lomakkeen käsittelyä.

Sepi [11.03.2003 19:43:02]

#

Mitenkäs noi if ja while -lauseiden lopetukset ovat tärkeitä? Siis if - endif ja while - endwhile? Ainakin php käsikirjassa ne näyttäisi olevan.

Antti Laaksonen [16.03.2003 00:37:48]

#

Enpä ole koskaan niitä käyttänyt enkä paljon nähnyt käytettävänkään. Mutta voisihan niistä pienen huomautuksen lisätä.

GeoHound [16.03.2003 10:52:07]

#

buu
Missä switchit?

DKH [21.03.2003 21:43:19]

#

Minä osaan niitä formijuttuja.

green [23.03.2003 15:57:45]

#

Switchit tosiaan, ja osoitteet käytettyihin funktioihin manuaalissa. https://www.php.net/manual/en/control-structures.php tuo lienee ainakin hyvä.

green [23.03.2003 15:58:26]

#

Jaha, ei toiminut niiku oletin :I noh, kaippa siitä selvän saa kun ei voi editoidakkaan(?).

chiqu [24.10.2004 16:08:35]

#

hmmh. Toi hissi juttu oli kyl hiano :) tota vis melkee kehittää tosta, mut rupeenkin tässä tekemään eka aihan omaa php pätkää.

D4_B34M [14.12.2004 00:12:52]

#

Hiiihihihi mä tepesin tossa hissin kohdalla :)
else
echo "jossain, missä sen ei pitäisi.";
:P

d-hunter [27.05.2005 20:12:08]

#

Toi hissi-juttu oli kyllä hauska.

Hyvin tehty opas

McGordon [04.06.2005 09:20:09]

#

Jes! Kiitos! Opin taas uutta PHP:tä!

miiro [12.11.2005 19:03:42]

#

D4_B34M kirjoitti:

Hiiihihihi mä tepesin tossa hissin kohdalla :)
else
echo "jossain, missä sen ei pitäisi.";
:P

Samoin :D

z3zim4 [01.04.2008 19:19:42]

#

Onneksi tämä ei vieläkään ole mielestäni vanhentunut vaikka tehtiin 5 vuotta sitten :)

apsu [05.07.2008 05:39:46]

#

miiro kirjoitti:

D4_B34M kirjoitti:

Hiiihihihi mä tepesin tossa hissin kohdalla :)
else
echo "jossain, missä sen ei pitäisi.";
:P

Samoin :D

Sama juttu

Rocceri [14.03.2009 12:39:15]

#

Tuosta koodista

<?php
$kerros = 0;

echo "Hissi on ";

if ($kerros < 0)
   echo 'Maan alla';
elseif ($kerros == 0)
   echo "Kuusamossa";
elseif ($kerros == 1)
   echo "Kiinassa.";
elseif ($kerros == 2 or $kerros == 3)
   echo "lentokoneessa.";
elseif ($kerros > 3)
   echo "siellä missä sinäkin";
else
   echo "jossain, missä sen ei pitäisi.";
?>

niin, tarvitsisin tekstilaatikon, mihin voi kirjoittaa numeron. Jos kirjoittaa 1 ja painaa lähetä se muuttaa $kerros = numeroa.
Onko mahdollista? :D

Muuten ihan mahtava opas

janijohannes [10.04.2009 21:00:01]

#

Rocceri kirjoitti:

Tuosta koodista

<?php
$kerros = 0;

echo "Hissi on ";

if ($kerros < 0)
   echo 'Maan alla';
elseif ($kerros == 0)
   echo "Kuusamossa";
elseif ($kerros == 1)
   echo "Kiinassa.";
elseif ($kerros == 2 or $kerros == 3)
   echo "lentokoneessa.";
elseif ($kerros > 3)
   echo "siellä missä sinäkin";
else
   echo "jossain, missä sen ei pitäisi.";
?>

niin, tarvitsisin tekstilaatikon, mihin voi kirjoittaa numeron. Jos kirjoittaa 1 ja painaa lähetä se muuttaa $kerros = numeroa.
Onko mahdollista? :D

Muuten ihan mahtava opas

<form action="?move" method="post">
<input type="text" name="kerros" /> <input type="submit" value="Lähetä" /></form>

<?php if (isset[$_GET['move'])) {
$kerros = $_POST['kerros'];

echo "Hissi on ";

if ($kerros < 0)
   echo 'Maan alla';
elseif ($kerros == 0)
   echo "Kuusamossa";
elseif ($kerros == 1)
   echo "Kiinassa.";
elseif ($kerros == 2 or $kerros == 3)
   echo "lentokoneessa.";
elseif ($kerros > 3)
   echo "siellä missä sinäkin";
else
   echo "jossain, missä sen ei pitäisi.";
}
?>

rax [23.05.2009 12:10:42]

#

<form action="?move" method="post">
<input type="text" name="kerros" /> <input type="submit" value="Lähetä" /></form>

<?php
if(isset($_GET['move'])) {
   $kerros = $_POST['kerros'];

   echo "Hissi on ";

   if ($kerros < 0)
      echo 'Maan alla';
   elseif ($kerros == 0)
      echo "Kuusamossa";
   elseif ($kerros == 1)
      echo "Kiinassa.";
   elseif ($kerros == 2 or $kerros == 3)
      echo "lentokoneessa.";
   elseif ($kerros > 3)
      echo "siellä missä sinäkin";
   else
      echo "jossain, missä sen ei pitäisi.";
}
?>

Janijohanneksella oliki siinä sitte virhe

Rocceri [26.06.2009 14:27:51]

#

Heh, nykyään nuo asiat heittää päästä. :D Ajatella, että joskus olen toollaista kysynyt. :D

teemuh [12.09.2011 15:17:17]

#

just nyt 2 vuoteen ei ole pistetty yhtään mitään tänne ehkä katseltu mutta ei kommentoitu kun sanon Aivan mahtava opas

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