PHP-perusteita ja 1. viikkotehtävä - Luento 4
Jatketaan PHP:n perusteiden läpikäymistä taulukoiden osalta. Lisäksi käydään läpi ensimmäistä viikkotehtävää sekä esitellään PHP-koodin debuggausmahdollisuuksia.
Luentotaltiointi
- sovellukset04.wmv 50M
- sovellukset04.mp3 15M
- sovellukset04_xvid.avi 129M
Taulukot
Taulukko on PHP:ssä oikeastaan "järjestetty kuvaus" (ordered map). Kuvaus on rakenne, joka yhdistää avaimen tiettyyn arvoon. Oletuksena avain on kokonaislukuindeksi, joka on tuttu muista ohjelmointikielistä kuten Javasta. Avaimen voi kuitenkin poikkeuksena Javaan PHP:ssä määrittää itse. Avain voi olla joko integer- tai string-tyyppinen.
Toisin kuin Javassa, taulukolle ei määritellä tietotyyppiä, eikä sen alkioiden sisältö ole rajoitettu samaan tietotyyppiin. Sama taulukko voi vapaasti sisältää esimerkiksi kokonaislukuja, merkkijonoja ja olioita. Taulukko voi myös sisältää toisia taulukoita, jolloin taulukoilla saadaan aikaan myös puurakenteita.
Taulukon määrittely
Taulukko voidaan määritellä joko array()-rakenteella tai hakasulkeita käyttävällä
syntaksilla. Seuraavassa on lyhyesti esitelty molemmat tavat.
array()
array()-rakenteelle annetaan parametriksi pilkulla erotettuna haluttu määrä avaimia
ja '=>'-merkeillä yhdistettynä niihin liittyviä arvoja. Avainta ei ole pakko määritellä. Oletuksena avaimeksi
tulee kokonaislukuindeksi luvusta 0 alkaen. Alla on esimerkki array()-rakenteesta.
<?php
$taulukko = array("eka" => 123
, 12
, "merkkijono"
, "jokuvaan" => 2.345 );
echo $taulukko["eka"]; //Tulostuu: 123
echo $taulukko[0]; //Tulostuu: 12
echo $taulukko[1]; //Tulostuu: merkkijono
echo $taulukko["jokuvaan"]; //Tulostuu: 2.345
?>
Esimerkissä ensimmäiselle ja viimeiselle alkiolle on määritelty avaimeksi merkkijono. Niille ei synny numeerista indeksiä, vaan niihin täytyy aina viitata määritellyn indeksin avulla. Toiselle ja kolmannelle alkiolle ei ole määritelty avainta, jolloin niiden avaimeksi tulee automaattisesti kokonaislukuindeksi nollasta alkaen. Siis avaimiksi tulee kokonaisluvut 0 ja 1. Jos avaimeksi jonkin alkion avaimeksi määritellään kokonaisluku, jatkuu indeksointi siitä kokonaisluvusta eteenpäin. Alla on esimerkki tästä.
<?php
$taulukko = array("selitys" => "tekstiä" //avain: "selitys"
, 12 //avain: 0
, 10 => "merkkijono" //avain: 10
, "jokuluku" => 2.345 //avain: "jokuluku"
, true ); //avain: 11
?>
Hakasulkusyntaksi
Taulukko voidaan luoda ilman array()-rakennetta asettamalla taulukkoon arvo seuraavalla tavalla.
<?php $taulukko[] = "jotain vaan"; ?>
Jos $taulukko-nimistä muuttujaa ei ole olemassa, luodaan sijoituslauseessa automaattisesti
uusi $taulukko-niminen taulukko. Jos taulukko on ennestään olemassa, lisätään siihen
uusi alkio, jonka indeksiksi tulee seuraava vapaana oleva kokonaisluku. Samalla
merkintätavalla voidaan myös määrittää taulukon alkioille avaimet.
<?php $taulukko["merkkijono1"] = "jotain vaan"; $taulukko[10] = 345.4546; ?>
Taulukon läpikäyminen
while- tai for-rakenne
Javassa tai C-kielessä on tapana käydä taulukko läpi while- tai for-rakenteessa indeksimuuttujan avulla. PHP:ssä voidaan käyttää samaa tapaa silloin, kun ollaan varmoja, että taulukon avaimet ovat oletusarvoja. Siis avaimien on oltava kokonaislukuja nollasta alkaen niin, että seuraava avain on aina edellinen luku lisättynä yhdellä. Alla on esimerkki tästä.
<?php
$taulukko = array("jono", "toinen", "kolmas", "keksi", "itse", "lisää");
for($i=0; $i<count($taulukko); $i++) {
echo $taulukko[$i];
}
?>
Tässä esimerkissä tavallinen indeksointi toimii hyvin. Läpikäyminen ei enää toimi, jos taulukosta poistetaan joku solu, tai jos jollekin solulle annetaan oletusarvosta poikkeava avain. Huom! Esimerkissä käytetty count()-funktio palauttaa taulukon sisältämien solujen määrän.
foreach()
Silloin, kun taulukon avaimet eivät noudata oletusindeksointia, ei edellisen kohdan for- tai while-rakenne enää toimi taulukon läpikäymisessä. Tätä varten PHP:ssä on olemassa foreach-rakenne. Alla on esimerkki sen käytöstä.
<?php
$taulukko = array("jono", 45 => "toinen", "kolmas", "keksi", "itse", "lisää");
foreach($taulukko as $arvo) {
echo $arvo;
}
?>
Siis foreach on silmukkarakenne, joka käy läpi kaikki parametrina annetun taulukon
solut. Esimerkin ilmaisu $taulukko as $arvo tarkoittaa sitä, että
jokaisella silmukan kierroksella $arvo-nimiseen muuttujaan sijoitetaan käsittelyssä
olevan taulukon solun arvo.
Taulukoiden vertailu
Taulukoita voidaan vertailla tavallisilla vertailuoperaattoreilla. Alla on taulukko
operaattoreiden merkityksistä. Esimerkeissä $taulukko1 ja $taulukko2
-muuttujat ovat siis taulukoita.
| Esimerkki | Selitys |
|---|---|
| $taulukko1==$taulukko2 | $taulukko1 ja $taulukko2 sisältävät samat elementit (ovat samanlaiset) |
| $taulukko1===$taulukko2 | $taulukko1 ja $taulukko2 sisältävät samat elementit samassa järjestyksessä (ovat identtiset) |
| $taulukko1!=$taulukko2 | $taulukko1 ja $taulukko2 eivät ole samanlaiset |
| $taulukko1<>$taulukko2 | sama kuin edellä |
| $taulukko1!==$taulukko2 | $taulukko1 ja $taulukko2 eivät ole identtiset |
Hyödyllisiä funktioita taulukoita käsitellessä
unset()
unset()-funktiolla voidaan poistaa parametrina annettu solu taulukosta.
Sen käytöstä on huomattava, että taulukko ei indeksoidu automaattisesti jonkun solun
poiston jälkeen. Jos esimerkiksi taulukossa olevien solujen avaimet ovat oletukset mukaisesti 0, 1 ja 2
ja niistä keskimmäinen solu poistetaan, on jäljelle jäävien solujen avaimet edelleen
0 ja 2.
count()
count()-funktio palauttaa parametrina annetun taulukon solujen määrän.
Ensimmäinen viikkotehtävä
Ensimmäisen viikkotehtävän tilastoja:
Katsellaan seuraavia asioita:
- Mallivastaukset
- Mihin hyppylinkki (1x1px transparent kuva)? (Lisätietoa: http://www.jimthatcher.com/skipnav.htm)
- Muistakaa oletusarvot lomakkeissa!
- Labelin ja inputin yhdistäminen
- Hover-efekti
- Taustakuvan toistaminen
- Taustavärin jatkuminen lohkossa
- abbr- ja acronym-elementtien erot
- scope-attribuutin käyttäminen
- Entiteetit (Vihjeitä: http://www.bbsinc.com/iso8859.html)
PHP:n debuggausmahdollisuudet
Eclipse-editori sisältää varsin hyvät debuggausominaisuudet. Käydään niitä läpi esimerkkien avulla. Ennen Eclipsen käytön aloittamista kannattaa käydä läpi editorin alkuvalmistelut.
Debuggausta hankaloittaa se, että users.jyu.fi-palvelimelta ei saada näkyviin PHP:n syntaksivirheitä, vaan pelkästään joitain ajon aikaisia virheitä. Normaalisti palvelimen pitäisi näyttää myös syntaksivirheet silloin, kun PHP-tiedoston alussa annetaan seuraavat rivit:
error_reporting(E_ALL);
ini_set('display_errors', '1');
Yliopiston users.jyu.fi-palvelimella on kuitenkin erikseen kielletty syntaksivirheiden näyttäminen, joten yllä olevalla määrityksellä saadaan näkyviin vain joitain ajonaikaisia virheitä, joista ei kuitenkaan ole merkittävää hyötyä. Eclipsen avulla saamme kuitenkin näkyviin myös syntaksivirheet.
Eclipse-esimerkkejä
- Syntaksivirheiden etsintä Problems-välilehdellä (dokumentti pitää ensin tallentaa, toimii PHP-, XHTML- ja CSS-koodeissa)
- Koodin täydennös (Ctrl+Välilyönti, toimii PHP-, XHTML- ja CSS-koodeissa)
- Breakpointin asettaminen (oikea hiiren näppäin -> Toggle Breakpoints)
- Debuggaus (oikea hiiren näppäin -> Debug As -> PHP Script):
- F6-näppäimellä pääsee koodissa eteenpäin rivin kerrallaan.
- Debug Output -välilehti näyttää, mitä XHTML-koodia syntyy.
- Browser Output -välilehti näyttää, miltä syntynyt XHTML-sivu näyttää todellisuudessa.
- Variables-välilehti näyttää muuttujien reaaliaikaiset arvot
- Takaisin "päänäyttöön" pääsee oikean yläkulman väkäsen takaa löytyvällä PHP-painikkeella
- Sivun "ajaminen" (oikea hiiren näppäin -> Run As -> PHP Web Page)


Käyttäjien kommentit