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

Ongelmia videon katselussa?

Verkkoluento

Tämä luento pidetään kokeellisena interaktiivisena verkkovideoluentona. Osallistuaksesi luentoon toimi seuraavasti:

  1. Avaa verkkostriimi mms://meedio.ad.jyu.fi/audit1-live joko Windows Media Playerillä tai Mplayerilla (Linux- ja Mac-käyttäjät). Videolähetys alkaa toimia n. klo10.
  2. Käynnistä jokin IRC-ohjelma (esim. chatzilla) ja ota yhteys johonkin IRCNETiin kuuluvaan IRC-palvelimeen ja liity #appro-kanavalle. IRC-kanavan kautta voit osoittaa kysymyksiä ja huomioita luennoijalle tai muille kurssilaisille.
    • Halutessasi kysyä jotain luennoijalta aloita kysymyksesi luennoijan IRC-nickillä, joka on Hazor. esim:
      <opis>Hazor: Miten voin tehdä X tai Y?
    • Anna luennon jälkeen palautetta joko suoraan IRCin kautta tai palautelomakkeella
  3. Seuraa luentoa ja yritä tehdä luennoijan mahdollisesti antamia tehtäviä. Jos jokin asia jää epäselväksi niin pyydä IRCin kautta luennoijalta lisäselitystä ja -vinkkejä.

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) {
    print $arvo;
  }
  foreach($taulukko as $key => $arvo) {
    print $key . " => " . $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.

EsimerkkiSelitys
$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<>$taulukko2sama 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:

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.

Syntaksivirheitä voi metsästää myös suorittamalla php-ohjelmansa jalava- tai halava-koneissa komentoriviltä:

[tjlahton@halava temp]$ php testi.php
PHP Parse error:  syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in /autowww/itwww/appro.mit.jyu.fi/temp/testi.php on line 32

Eclipse-esimerkkejä

Käyttäjien kommentit

Kommentoi tätä sivua Lisää uusi kommentti
Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/sovellukset/luennot/luento4/
© Antti Ekonoja (anjoekon@jyu.fi) <http://users.jyu.fi/~anjoekon/>
Tommi Lahtonen (tommi.j.lahtonen@jyu.fi) <http://hazor.iki.fi/>
Jukka Mäntylä (jmantyla@iki.fi) <http://www.iki.fi/jmantyla/>
2008-05-06 16:40:20
Informaatioteknologia - Jyväskylän yliopiston IT-tiedekunta ja avoin yliopisto