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.
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.
6 > 5 and 7 == 7
6 == 5 or 6 > 5
! 5 > 7
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
-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 } ?>
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."; ?>
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 break
ille tai continue
lle 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; } } ?>
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
Aika hauska toi "missä sen ei pitäisi" :D
En kyllä muistaakseni niin ole sanonut. Oppaaseen neljä olen kyllä lupaillut lomakkeen käsittelyä.
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.
Enpä ole koskaan niitä käyttänyt enkä paljon nähnyt käytettävänkään. Mutta voisihan niistä pienen huomautuksen lisätä.
buu
Missä switchit?
Minä osaan niitä formijuttuja.
Switchit tosiaan, ja osoitteet käytettyihin funktioihin manuaalissa. https://www.php.net/manual/en/control-structures.php tuo lienee ainakin hyvä.
Jaha, ei toiminut niiku oletin :I noh, kaippa siitä selvän saa kun ei voi editoidakkaan(?).
hmmh. Toi hissi juttu oli kyl hiano :) tota vis melkee kehittää tosta, mut rupeenkin tässä tekemään eka aihan omaa php pätkää.
Hiiihihihi mä tepesin tossa hissin kohdalla :)
else
echo "jossain, missä sen ei pitäisi.";
:P
Toi hissi-juttu oli kyllä hauska.
Hyvin tehty opas
Jes! Kiitos! Opin taas uutta PHP:tä!
D4_B34M kirjoitti:
Hiiihihihi mä tepesin tossa hissin kohdalla :)
else
echo "jossain, missä sen ei pitäisi.";
:P
Samoin :D
Onneksi tämä ei vieläkään ole mielestäni vanhentunut vaikka tehtiin 5 vuotta sitten :)
miiro kirjoitti:
D4_B34M kirjoitti:
Hiiihihihi mä tepesin tossa hissin kohdalla :)
else
echo "jossain, missä sen ei pitäisi.";
:PSamoin :D
Sama juttu
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
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? :DMuuten 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."; } ?>
<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
Heh, nykyään nuo asiat heittää päästä. :D Ajatella, että joskus olen toollaista kysynyt. :D
just nyt 2 vuoteen ei ole pistetty yhtään mitään tänne ehkä katseltu mutta ei kommentoitu kun sanon Aivan mahtava opas
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.