7. Taulukot 105. Kuinka taulukoiden tietoa käsitellään ja lajitellaan

Samankaltaiset tiedostot
8. Oliot 123. Kuinka luokkia luodaan ja olioita saadaan aikaan. Kuinka luodaan ja käsitellään ominaisuuksia ja metodeja

6. Funktiot 85. Kuinka funktioita määritellään ja kutsutaan. Kuinka funktioille viedään arvoja ja niistä palautetaan arvoja

OPPITUNTI 16 Tiedon käsittely

3.1 Mitä tarkoittaan heredoc? Milloin sitä kannattaa käyttää? Kirjoita esimerkki sen käyttämisestä.

OPPITUNTI 5 Ohjelman kulku

OPPITUNTI 3 Ensimmäinen skripti

OPPITUNTI 11 DBM-funktioiden käyttö

Harjoitustyö: virtuaalikone

Ohjelmoinnin perusteet Y Python

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Taulukot. Jukka Harju, Jukka Juslin

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Ohjelmoinnin perusteet Y Python

OPPITUNTI15 Päivämäärien käsittely

Ohjelmoinnin perusteet Y Python

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op)

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Sisältö. 2. Taulukot. Yleistä. Yleistä

Sisältö. 22. Taulukot. Yleistä. Yleistä

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Osoitin ja viittaus C++:ssa

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Harjoitus 6. Käytä String-luokasta vain charat- ja length-operaatioita.

Ohjelmoinnin peruskurssi Y1

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Valintanauhan komennot Valintanauhan kussakin välilehdessä on ryhmiä ja kussakin ryhmässä on toisiinsa liittyviä komentoja.

Ohjelmoinnin perusteet Y Python

3. Muuttujat ja operaatiot 3.1

7. Näytölle tulostaminen 7.1

OSA II Kieli. Oppitunti. 4. Rakennuslohkot 5. Ohjelman kulku 6. Funktiot 7. Taulukot 8. Oliot

PHP tehtävä 3 Atte Pekarinen TIKT13A

Ohjelmoinnin perusteet Y Python

OPPITUNTI 20 Tilan tallentaminen istuntofunktioilla

Ohjelmoinnin perusteet Y Python

Tieto- ja tallennusrakenteet

Tietorakenteet ja algoritmit

Tietueet. Tietueiden määrittely

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin peruskurssi Y1

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

Ohjelmoinnin perusteet Y Python

Zeon PDF Driver Trial

Ohjelmoinnin perusteet Y Python

Harjoitus 4 (viikko 47)

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Tietorakenteet ja algoritmit

Harjoitus 6 (viikko 42)

1. Mitä tehdään ensiksi?

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmoinnin perusteet Y Python

PHP:n alkeita ja taustaa. Markus Norrena

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Luento 5. Timo Savola. 28. huhtikuuta 2006

1 PHP-sovelluksen toiminta

815338A Ohjelmointikielten periaatteet

Rakenteiset tietotyypit Moniulotteiset taulukot

JavaScript alkeet Esimerkkikoodeja moniste 2 ( Metropolia)

Ohjelmointi 1 Taulukot ja merkkijonot

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

18. Abstraktit tietotyypit 18.1

Ohjelmiston testaus ja laatu. Testausmenetelmiä

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op)

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Algoritmit 2. Luento 3 Ti Timo Männikkö

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Korpusten käsittely clt131, P Luento 5

OPPITUNTI 24 Esimerkki (Osa 2)

Ohjelmoinnin peruskurssi Y1

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Harjoitus 2 (viikko 45)

Algoritmit 2. Luento 3 Ti Timo Männikkö

Java-kielen perusteet

Erittäin nopea tapa saada kehitysympäristö php:lle pystyyn Voidaan asentaa muistitikulle

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Taulukoiden käsittely Javalla

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

Tutoriaaliläsnäoloista

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus?

17. Javan omat luokat 17.1

VERKKOSOVELLUSTEN OHJELMOINTI, JOHDATUS PHP:HEN

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ryhmät. Pauliina Munter/Suvi Junes Tampereen yliopisto/ Tietohallinto 2014

Tietorakenteet, laskuharjoitus 7, ratkaisuja

17. Javan omat luokat 17.1

Transkriptio:

7. Taulukot 105 OPPITUNTI 7 Taulukot Taulukot ja niiden käsittelyyn liittyvät toiminnot laajentavat suuresti PHP4-skriptien käyttöaluetta ja joustavuutta. Kun tunnet taulukot, voit tallentaa niihin monimutkaisia tietorakenteita ja pitää ne järjestyksessä. Tällä tunnilla sinulle esitellään taulukot ja joitakin funktioita, joiden avulla voit käsitellä taulukoita helpommin. Tämän tunnin aiheita ovat seuraavat: Mitä taulukot ovat ja kuinka niitä luodaan Kuinka saada tietoa taulukoista Kuinka taulukoiden tietoa käsitellään ja lajitellaan

106 7. Taulukot Mikä on taulukko? Tiedät jo, että muuttuja on kori, johon voidaan tilapäisesti tallentaa arvo. Käyttämällä muuttujia voit luoda skriptin, joka tallentaa, muokkaa ja tulostaa erilaista tietoa jokaisella ajokerralla. Valitettavasti voit tallentaa muuttujaan vain yhden arvon kerrallaan. Taulukot ovat erikoismuuttujia, jotka sallivat poikkeuksia tähän rajoitukseen. Taulukkoon voidaan tallentaa haluttu määrä arvoja. Kuhunkin arvoon liittyy merkkijono tai järjestysnumero eli indeksi, joka kertoo, missä kohtaa taulukkoa arvo sijaitsee. Jos muuttuja on ikään kuin yksittäinen laatikko, voidaan taulukkoa pitää lipastona tai laatikostona. Kyseessä on yksi säiliö, johon voidaan sijoittaa useita kohteita. Taulukko on luettelomuuttuja eli muuttuja, joka sisältää useita alkioita, jotka on indeksoitu numeroiden tai merkkijonojen avulla. Taulukkoon voidaan tallentaa useita arvoja, arvot voidaan asettaa haluttuun järjestykseen ja niitä voidaan käsitellä käyttäen yhtä muuttujanimeä. Jos ohjelmassa on tallennettava viisi arvoa, voidaan niitä varten tietenkin määritellä viisi erillistä muuttujaa. Miksi taulukko olisi sitten parempi vaihtoehto? Ensinnäkin taulukko on joustava. Siihen voidaan tilanteen mukaan tallentaa kaksi arvoa tai 200 arvoa eikä uusia muuttujia tarvitse lainkaan määritellä. Toiseksi, taulukon tietoja on helppo käsitellä. Voit esimerkiksi käydä kaikki alkiot läpi silmukassa tai ottaa esille vain yhden alkion. Voit lajitella kohteet numeerisesti, aakkosjärjestykseen tai jopa oman kaavasi mukaan. Jokaista taulukon kohdetta kutsutaan taulukon alkioksi. Alkioon päästään käsiksi sen indeksin avulla. Indeksi voi olla merkkijono tai numero. Oletuksena taulukon alkioiden indeksit alkavat numerosta nolla (0). On siis tärkeää muistaa, että viimeinen indeksi on alkioiden määrä vähennettynä yhdellä. Taulukko 7.1 esittää users-taulukon alkiot. Huomaa, että kolmannella alkiolla on indeksi kaksi. Taulukko 7.1. Users-taulukon alkiot Indeksinumero Arvo Monesko alkio? 0 Bert 1. 1 Sharon 2. 2 Betty 3. 3 Harry 4. Merkkijonojen käyttäminen indeksointiin voi olla hyödyllistä silloin, kuin taulukkoon on tallennettava sekä nimiä että arvoja. PHP4 tarjoaa käyttöön työkaluja taulukoiden käsittelyyn. Käymme läpi joitakin työkaluja tällä tunnilla ja joitakin taas luvussa 16 Tiedon käsittely : Taulukoiden luonti Oletuksena taulukot ovat arvoluetteloja, jotka on indeksoitu numeroin. Taulukkoon voidaan sijoittaa arvoja kahdella tavalla: array()-funktion avulla tai suoraan taulukon nimen ja hakasulkuparin avulla. Seuraavissa jaksoissa käytetään kumpaakin menettelytapaa. Taulukoiden määrittely array()-funktiolla Array()-funktio on hyödyllinen, kun haluat sijoittaa taulukkoon useita arvoja yhdellä kertaa. Määritelkäämme nyt taulukko nimeltä $users ja sijoittakaamme siihen neljä merkkijonoa: $users = array ("Bert", "Sharon", "Betty", "Harry" ); Voit nyt käsitellä kolmatta alkiota käyttäen indeksiarvoa 2:

7. Taulukot 107 print "$users[2]"; Lause tulostaisi nimen Sharon. Taulukon alkion indeksi sijoitetaan taulukon nimen perässä olevien hakasulkujen sisälle. Samalla tavalla voidaan joko lukea arvo taulukosta tai sijoittaa arvo taulukkoon. Muista, että taulukoiden indeksointi alkaa oletuksena nollasta, joten viimeinen indeksi on aina yhtä pienempi kuin alkioiden määrä. Taulukoiden määrittely tai alkioiden lisääminen taulukkoon hakasulkuoperaattoria käyttäen Voit luoda uuden taulukon (tai tehdä lisäyksiä aiempaan taulukkoon) hakasulkuoperaattorin avulla. PHP4:ssä hakasulkuoperaattoria voidaan kutsua myös taulukkotunnukseksi. Määrittelyssä ja alkioiden lisäämisessä ei tarvitse käyttää indeksinumeroa. Seuraavassa luodaan $users-taulukko uudelleen: $users[] = " Bert"; $users[] = " Sharon"; $users[] = " Betty"; $users[] = " Harry"; Huomaa, että hakasulkujen sisällä ei ole indeksejä. PHP4 hoitaa indeksinumerot automaattisesti, joten sinun ei tarvitse murehtia sitä, mikä on seuraava vapaa paikka. Olisimme voineet lisätä indeksinumerot halutessamme ja tulos olisi ollut aivan sama. Niin ei kuitenkaan kannata tehdä. Katsopa seuraavaa koodia: $users[0] = " Bert"; $users[200] = "Sharon"; Taulukossa on kaksi alkiota, mutta viimeisen alkion indeksi on 200. PHP4 ei tule alustamaan väliin jääviä alkioita. Tällainen menettely aiheuttaisi sekaannusta, kun taulukon alkioita yritetään käsitellä. Taulukoiden luomisen lisäksi hakasulkuoperaattorin avulla voidaan myös lisätä uusia arvoja olemassa olevan taulukon loppuun. Seuraava koodilohko määrittelee $users-taulukon array()-funktion avulla ja käyttää sitten hakasulkuja uuden alkion lisäämiseen: $users = array ("Bert", " Sharon", "Betty", "Harry" ); $users[] = "sally";

108 7. Taulukot Assosiatiiviset taulukot Numeerisesti indeksoidut taulukot ovat hyödyllisiä tallennettaessa taulukkoon arvoja tietyssä järjestyksessä. Joskus taulukon alkioihin on hyvä päästä käsiksi myös alkion nimen avulla. Assosiatiivinen taulukko käyttää indeksointiin merkkijonoja, jotka sijoitetaan hakasulkujen sisälle numeroarvojen sijaan. Otetaan esille vaikkapa osoitekirja. Kumpi olisi helpompaa: nimitietojen hakeminen merkkijonon nimi avulla vai jonkin numeroarvon (indeksin) avulla? Taulukoita, joiden indeksoinnissa käytetään merkkijonoja, kutsutaan assosiatiivisiksi taulukoiksi. Niihin voidaan myös viitata nimellä hash-taulukko. Myös assosiatiivinen taulukko voidaan määritellä käyttäen joko array()-funktiota tai hakasulkuja. Assosiatiivisen ja numeerisesti indeksoidun taulukon erottelu ei ole aivan ehdotonta PHP:ssä. Ne eivät ole erityyppisiä taulukoita kuten Perlissä. On kuitenkin hyvä kohdella niitä eri tavoin. Kumpikin vaatii omat menettelytapansa käsittelyyn ja muokkaamiseen. Assosiatiivisen taulukon määrittely array()-funktiolla Määrittelyssä on annettava jokaisen alkion avain ja arvo. Seuraava koodi luo assosiatiivisen taulukon nimeltä $character, johon tulee neljä alkiota: $character = array ( name=>"bob", occupation=>"superhero", age=>30, "special power"=>"x-ray vision" ); Nyt voimme vaikkapa tulostaa tietyn kentän arvon lauseella: print $character[age]; Assosiatiivisen taulukon avaimet ovat merkkijonoja, mutta niitä ei ole välttämätöntä laittaa lainausmerkkeihin ellei niissä ole enempää kuin yksi sana.

7. Taulukot 109 Assosiatiivisen taulukon suora määrittely tai kasvattaminen Voit luoda tai lisätä nimi/arvo-pareja assosiatiiviseen taulukkoon yksinkertaisesti sijoittamalla arvon nimettyyn alkioon. Seuraava koodi luo aiemman $character-taulukon uudelleen lisäämällä arvon kuhunkin avaimeen: $character[name] = "bob"; $character[occupation] = "superhero"; $character[age] = 30; $character["special power"] = "x-ray vision"; Moniulotteiset taulukot Toistaiseksi olemme vain sanoneet, että taulukon alkiot ovat arvoja. $character-taulukkomme kolmessa alkiossa oli merkkijonoja ja yhdessä kokonaisluku. Todellisuus on kuitenkin hieman monimutkaisempi. Itse asiassa taulukon alkio voi olla arvo, olio tai jopa toinen taulukko. Moniulotteinen taulukko on taulukoista koostuva taulukko. Kuvittele taulukkoa, jonka alkiot ovat taulukoita. Kolmannen alkion toisen alkion käsittelyssä on käytettävä kahta indeksiä: $array[1][2] Taulukoita, jotka sisältävät alkioinaan taulukoita, kutsutaan moniulotteisiksi taulukoiksi. Koska taulukon alkiona voi olla taulukko, on mahdollista luoda kehittyneitä tietorakenteita suhteellisen helposti. Listaus 7.1 määrittelee taulukon, jonka jokainen alkio on assosiatiivinen taulukko. Listaus 7.1 Moniulotteisen taulukon määritteleminen 1: <html> 2: <head> 3: <title>listing 7.1</title> 4: </head> 5: <body> 6: <?php 7: $characters = array ( 8: array ( name=>"bob", 9: occupation=>"superhero", 10: age=>30, 11: specialty=>"x-ray vision" ),

110 7. Taulukot 12: array ( name=>"sally", 13: occupation=>"superhero", 14: age=>24, 15: specialty=>"superhuman strength" ), 16: array ( name=>"mary", 17: occupation=>"arch villain", 18: age=>63, 19: specialty=>"nanotechnology" ) 20: ); 21: 22: print $characters[0][occupation]; 23: // tulostaa "superhero" 24:?> 25: </body> 26: </html> Huomaa, että olemme laittaneet taulukkofunktion kutsut taulukkofunktiokutsun sisälle. Ensin määrittelemme taulukon. Sitten määrittelemme assosiatiivisen taulukon jokaiseksi alkioksi. Viittaus $user[2] viittaa siksi päätaulukon kolmanteen assosiatiiviseen taulukkoon. Sen jälkeen voimmekin käsitellä mitä tahansa assosiatiivisen taulukon kenttää. Esimerkiksi kentän $user[2][name] arvona on mary ja kentän $user[2][age] arvona on 63. Kun omaksut tuon ajattelun, on helppoa luoda monimutkaisia assosiatiivisten ja numeerisesti indeksoitujen taulukoiden yhdistelmiä. Taulukoiden käsittely Toistaiseksi olet nähnyt tapoja luoda taulukoita ja lisätä niiden kokoa. Tässä jaksossa saat tutustua joihinkin PHP4:n tarjoamiin työkaluihin, joiden avulla saat tietoa taulukoista ja voit käsitellä niiden alkioita. Taulukon koon selvittäminen Taulukon alkioon päästään käsiksi indeksin avulla: print $user[4] Koska taulukko on joustava tietorakenne, et aina tiedä, kuinka monta alkiota tietyssä taulukossa on. Voit käyttää count()-funktiota ongelman ratkaisemiseen. Funktio palauttaa taulukon alkioiden lukumäärän. Seuraavassa koodissa määritellään numeerisesti indeksoitu taulukko ja käytetään count()-funktiota sen viimeisen alkion käsittelyyn:

7. Taulukot 111 $users = array ("Bert", "Sharon", "Betty", "Harry" ); print $users[count($users)-1]; Huomaa, että vähensimme ykkösen count()-funktion palauttamasta arvosta. Se johtuu siitä, että count() palauttaa alkioiden lukumäärän, ei viimeistä indeksiä. Vaikka taulukoiden indeksointi alkaakin oletuksena nollasta, on mahdollista muuttaa käytäntöä. Selvyyden ja johdonmukaisuuden vuoksi sitä ei kuitenkaan suositella. Taulukon läpikäynti silmukalla Taulukkoa voidaan käydä läpi silmukan avulla monin eri tavoin. Seuraavissa esimerkeissä käytetään PHP4:n tehokasta foreach-lausetta. Muutamia muita metodeja tutkitaan luvussa 16. Foreach-lause esiteltiin PHP4:n myötä. Numeerisesti indeksoitujen taulukoiden yhteydessä voit käyttää foreach-lausetta seuraavasti: foreach( $array as $temp ) //... jossa $array on läpikäytävä taulukko ja $temp muuttuja, johon kukin alkio tallennetaan tilapäisesti. Seuraava koodi määrittelee numeerisesti indeksoidun taulukon ja käyttää foreach-lausetta sen jokaisen alkion käsittelyyn $users = array ("Bert", "Sharon", "Betty", "Harry" ); foreach ( $users as $val ) print "$val<br>"; Koodin aikaansaama tulostus esitetään kuvassa 7.1. Kunkin alkion arvo tallennetaan tilapäisesti muuttujaan $val, joka sitten tulostetaan selaimelle. Jos siirryt PHP4:stä Perliin, pidä mielessäsi kielten välinen merkittävä ero foreach-lauseen käyttäytymisessä. Jos

112 7. Taulukot Perlissä muutetaan tilapäismuuttujan arvoa silmukan sisällä, taulukon vastaava alkio muuttuu myöskin. Vastaavasti PHP4:ssä tilapäismuuttujan arvon muutoksella ei ole vaikutusta taulukon alkioon. Niinpä edellisessä koodissa $val-muuttujan arvon muuttamisella ei olisi vaikutusta $users-taulukkoon. Luvussa 16 on esillä tapa muuttaa numeerisesti indeksoitua taulukkoa foreach-silmukalla. Assosiatiivisen taulukon läpikäynti Voidaksesi käsitellä sekä avaimia että arvoja, sinun on muutettava foreach-lauseen käyttötapaa hieman. KUVA 7.1 Taulukon läpikäynti. Assosiatiivisten taulukoiden kohdalla foreach-lauseen tulisi näyttää tältä: foreach( $array as $key=>$value ) //... jossa $array on kohdetaulukko, $key muuttuja, johon kukin avain tallennetaan tilapäisesti ja $value muuttuja, joka tallentaa tilapäisesti kunkin arvon. Listaus 7.2 luo assosiatiivisen taulukon ja käsittelee kutakin avainta ja arvoa vuoron perään. Listaus 7.2 Assosiatiivisen taulukon läpikäynti foreach-silmukalla 1: <html> 2: <head> 3: <title>listing 7.2</title> 4: </head> 5: <body> 6: <?php

7. Taulukot 113 7: $character = array ( 8: name=>"bob", 9: occupation=>"superhero", 10: age=>30, 11: "special power"=>"x-ray vision" 12: ); 13: foreach ( $character as $key=>$val ) 14: 15: print "$key = $val<br>"; 16: 17: 18:?> 19: </body> 20: </html> Listauksen tuottama tulostus esitetään kuvassa 7.2. KUVA 7.2 Assosiatiivisen taulukon läpikäynti Moniulotteisen taulukon tulostaminen Nyt voimme yhdistää nuo kaksi tekniikkaa ja tulostaa moniulotteisen taulukon sisällön. Tuo taulukko luotiin listauksessa 7.1. Listaus 7.3 määrittelee samanlaisen taulukon ja käyttää foreach-silmukkaa taulukon alkioiden käsittelyyn. Listaus 7.3 Moniulotteisen taulukon läpikäynti 1: <html> 2: <head> 3: <title>listing 7.3</title>

114 7. Taulukot 4: </head> 5: <body> 6: <?php 7: $characters = array ( 8: array ( name=>"bob", 9: occupation=>"superhero", 10: age=>30, 11: specialty=>"x-ray vision" ), 12: array ( name=>"sally", 13: occupation=>"superhero", 14: age=>24, 15: specialty=>"superhuman strength" ), 16: array ( name=>"mary", 17: occupation=>"arch villain", 18: age=>63, 19: specialty=>"nanotechnology" ) 20: ); 21: 22: foreach ( $characters as $val ) 23: 24: foreach ( $val as $key=>$final_val ) 25: 26: print "$key: $final_val<br>"; 27: 28: print "<br>"; 29: 30:?> 31: </body> 32: </html> Voit nähdä listauksen 7.3 aikaansaaman tulosteen kuvassa 7.3. Koodissa luodaan nyt kaksi foreachsilmukkaa. Ulompi silmukka käsittelee kutakin numeerisesti indeksoidun $users-taulukon alkiota ja sijoittaa kunkin arvon $val-muuttujaan. Koska $val itse sisältää assosiatiivisen taulukon, voimme käydä sen läpi ja tulostaa sen alkiot (jotka tallennetaan tilapäisesti muuttujiin $key ja $final_val).

7. Taulukot 115 Jotta tämä tekniikka toimisi odotetulla tavalla, meidän on varmistettava, että $val sisältää aina taulukon. Voisimme ehkäistä mahdollisia virheitä käyttämällä is_array()-funktiota testaamaan $val. Jos is_array() palauttaa arvon true, on argumentti taulukko. KUVA 7.3 Moniulotteisen taulukon läpikäynti. Taulukoiden manipulointi Nyt voisimme täyttää taulukoita ja käsitellä niiden alkioita edellä kuvatuin menetelmin. PHP4 tarjoaa kuitenkin käyttöön funktioita, joilla voidaan tehdä paljon muutakin ja vieläpä helposti. Jos olet käyttänyt Perliä, huomaat jotkin funktiot tutuiksi! Kahden taulukon liittäminen array_merge()-funktiolla Array_merge() ottaa argumenteikseen kaksi tai useampia taulukoita ja palauttaa taulukon, jossa niiden alkiot on liitetty toisiinsa. Seuraava esimerkki luo ensin kaksi taulukkoa ja liittää sitten toisen taulukon ensimmäiseen. Lopuksi tuloksena oleva taulukko tulostetaan: $first = array("a", "b", "c"); $second = array(1,2,3); $third = array_merge( $first, $second ); foreach ( $third as $val ) print "$val<br>";

116 7. Taulukot $third-taulukko sisältää sekä $first- että $second-taulukon kaikki alkiot. Siten koodin foreach-lause tulostaa arvot 'a', 'b', 'c', 1, 2, 3 ja <BR>-tagin (rivinvaihdon) niiden väliin. Muista, että array_merge()-funktiolle viedyt taulukot jäävät itse koskemattomiksi. Array_merge()-funktio esiteltiin PHP4:n myötä. Useiden arvojen sijoittaminen taulukkoon array_push()-funktiolla Array_push() ottaa argumentikseen taulukon ja sitten halutun määrän muita parametreja, jotka ovat taulukkoon sijoitettavia arvoja. Huomaa, että array_push() poikkeaa array_merge()-funktiosta siinä, että array_push() muuttaa argumenttina olevaa taulukkoa. Funktio palauttaa taulukon alkioiden kokonaismäärän. Luokaamme nyt taulukkoa ja lisätkäämme siihen joitakin arvoja: $first = array("a", "b", "c"); $total = array_push( $first, 1, 2, 3 ); print "There are $total elements in \$first<p>"; foreach ( $first as $val ) print "$val<br>"; Koska array_push() palauttaa muuntamansa taulukon alkioiden määrän, voimme tallentaa arvon (6) muuttujaan ja tulostaa selaimelle. Nyt $first-taulukko sisältää sen alkuperäiset alkiot ja lisäksi kolme kokonaislukua, jotka annettiin array_push()-funktion argumentteina. Nuo arvot tulostetaan selaimelle foreach-lauseessa. Huomaa, että käytimme kenoviivamerkkiä tulostaessamme merkkijonon \$first. Jos käytät taalamerkkiä, jota seuraa merkkijonossa olevia numeroita ja kirjaimia, PHP yrittää lisätä tuon nimisen muuttujan arvon. Yllä olevassa esimerkissä halusimme tulostaa merkkijonon $first emmekä $first-muuttujan arvoa. Kun haluamme tulostaa erikoismerkin $, meidän on laitettava sen eteen kenoviiva (\). PHP tulostaa sitten itse taalamerkin tulkkaamatta sitä muuttujan etuliitteeksi. Tässä prosessissa kenoviivaa kutsutaan escapemerkiksi. Escape-merkkiä käyttämällä voidaan jonkin merkin alkuperäinen merkitys ohittaa. Huomio, kaikki Perl-käyttäjät! Jos olet käyttänyt Perlin push()-funktiota, sinun tulisi huomata, että jos viet toisen taulukon array_push()-funktiolle, se sijoitetaan yksittäisenä alkiona ja luodaan moniulotteinen taulukko. Jos haluat yhdistää kaksi taulukkoa, käytä array_merge()-funktiota.

7. Taulukot 117 Taulukon ensimmäisen alkion poistaminen array_shift()-funktiolla Funktio array_shift() poistaa ja palauttaa viedyn taulukon ensimmäisen alkion. Seuraavassa esimerkissä käytetään array_shift()-funktiota yhdessä while-silmukan kanssa. Testaamme count()-funktion palauttaman arvon nähdäksemme, sisältääkö taulukko edelleenkin alkioita: <?php $an_array = array("a", "b", "c"); while ( count( $an_array) ) $val = array_shift( $an_array); print "$val<br>"; print "there are ".count($an_array)." elements in \$an_array <br>";?> Koodin tulostus esitetään kuvassa 7.4. KUVA 7.4 Funktion array_shift() käyttäminen taulukon alkioiden poistamiseen Funktio on hyödyllinen, kun on luotava jono ja käsiteltävä sitä, kunnes se on tyhjä. Array_shift() tuli sekin PHP4:n mukana. Taulukoiden pilkkominen array_slice()-funktiolla Array_slice() erottaa viipaleen taulukosta. Se ottaa argumenteikseen taulukon, alkusiirtymän ja (valinnaisen) pituuden. Jos pituutta ei anneta, funktio olettaa, että mukaan on otettava kaikki loput alkiot lähtöpisteestä alkaen. Array_slice() ei muuta vietyä taulukkoa. Se palauttaa uuden taulukon, joka sisältää pyydetyt alkiot. Seuraavassa esimerkissä luomme taulukon ja erotamme siitä uuden kolmialkioisen taulukon:

118 7. Taulukot $first = array("a", "b", "c", "d", "e", "f"); $second = array_slice($first, 2, 3); foreach ( $second as $var ) print "$var<br>"; Koodi tulostaa arvot 'c', 'd' ja 'e' laittaen väliin <BR>-tagin. Huomaa, että siirtymä on sisäinen, jos ajattelemme sitä ensimmäisen pyydettävän alkion indeksinä. Toisin sanoen $second-taulukon ensimmäinen alkio on sama kuin $first[2]. Jos annamme array_slice()-funktiolle siirtymäarvon, joka on pienempi kuin nolla, palautettuun taulukkoon laitetaan alkiot viedyn taulukon lopusta alkaen. Jos pituutena on kutsun yhteydessä negatiivinen arvo, palautettu osa sisältää kaikki alkiot siirtymäkohdasta loppuun saakka. Array_slice() tuli PHP4:n mukana. s Taulukoiden lajittelu Lajittelu on ehkä ovelinta, mitä taulukoille voidaan tehdä. PHP4:n funktioilla on helppo järjestellä taulukoita. Tässä jaksossa tutkimme muutamia funktioita, joilla voimme lajitella sekä numeerisesti indeksoituja että assosiatiivisia taulukoita. Numeerisesti indeksoitujen taulukoiden lajittelu sort()-funktiolla Sort()-funktio ottaa argumentikseen taulukon ja lajittelee sen joko aakkosjärjestykseen (jos taulukossa on merkkijonoja) tai numeeriseen järjestykseen (jos alkiot ovat lukuja). Funktio ei palauta mitään arvoa, se vain muokkaa vietyä taulukkoa. Huomaa, että toiminta eroaa Perlin sort()-funktiosta tältä osin. Seuraava koodi alustaa taulukon yksittäisillä kirjaimilla, lajittelee sen ja tulostaa muunnetun taulukon: $an_array = array("x","a","f","c"); sort( $an_array); foreach ( $an_array as $var ) print "$var<br>";

7. Taulukot 119 Älä vie assosiatiivista taulukkoa sort()-funktiolle. Havaitset piankin, että arvot lajitellaan, mutta avaimesi ovat kadonneet. Ne korvataan numeerisilla indekseillä, jotka ovat lajittelujärjestyksen mukaisia. Taulukko voidaan laittaa myös käänteiseen järjestykseen rsort()-funktiolla, jonka syntaksi on samanlainen kuin sort()-funktiolla. Assosiatiivisen taulukon lajittelu asort()-funktiolla Asort() lajittelee assosiatiivisen taulukon samalla lailla kuin sort(). Se säilyttää kuitenkin taulukon avaimet: $first = array("first"=>5,"second"=>2,"third"=>1); asort( $first ); foreach ( $first as $key => $val ) print "$key = $val<br>"; Tämän koodin tulostus esitetään kuvassa 7.5. Voit lajitella assosiatiivisen taulukon käänteiseen järjestykseen arsort()-funktiolla. KUVA 7.5 Assosiatiivisen taulukon lajittelu arvojen mukaan asort()-funktiolla

120 7. Taulukot Assosiatiivisen taulukon lajittelu avaimen mukaan ksort()-funktiolla Ksort() lajittelee assosiatiivisen taulukon avainten mukaan. Funktio muuttaa vietyä taulukkoa, mutta ei palauta mitään arvoa return-lauseella. $first = array("x"=>5,"a"=>2,"f"=>1); ksort( $first ); foreach ( $first as $key => $val ) print "$key = $val<br>"; Koodin tulostus on kuvassa 7.6. Assosiatiivinen taulukko voidaan asettaa käänteiseen avainjärjestykseen funktiolla krsort(). Kuva 7.6 Assosiatiivisen taulukon lajittelu avaimen mukaan ksort()-funktiolla. Yhteenveto Tällä tunnilla opit tuntemaan taulukot ja joitakin PHP4:n tarjoamia taulukkofunktioita. Nyt sinun tulisi kyetä luomaan sekä numeerisesti indeksoitu että assosiatiivinen taulukko ja tulostamaan niiden arvot foreachsilmukan avulla. Luvussa käsiteltiin myös taulukoiden yhdistämistä moniulotteisten taulukoiden luomiseksi. Näit myös, kuinka taulukoihin voidaan lisätä uusia alkioita ja poistaa niistä useita alkioita. Lopuksi tutkimme joitakin tekniikoita, joilla PHP4 lajittelee taulukoita.

7. Taulukot 121 K&V K Jos foreach-lause tuli vasta PHP4:n mukana, kuinka PHP3:n käyttäjät kävivät taulukkoa läpi? V PHP3:ssa taulukkoa tutkittiin each()-lauseella, joka yhdistettiin while-lauseeseen. Tästä menettelystä kerrotaan luvussa 16. K Onko taulukoiden käsittelyyn olemassa muitakin funktioita kuin ne, jotka käsiteltiin tässä luvussa? V PHP4 tukee monia taulukkofunktioita. Voit lukea joistakin niistä hieman lisää luvusta 16; tarkat kuvaukset kaikista vastaavista funktioista ovat PHP:n virallisissa manuaaleissa (http://www.php.net/manual/ref.array.php). K Jos haluan tutkia taulukon jokaisen alkion, olisiko for-silmukka mukava keino siihen? V For-silmukan kanssa tulee olla huolellinen. Et voi aina olla varma siitä, että indeksoinnissa on käytetty peräkkäin numeroituja avaimia. KUVA 7.6 Assosiatiivisen taulukon lajittelu avainten mukaan ksort()-funktiolla. Työpaja Työpaja tarjoaa pikakysymyksiä, joiden avulla voit kerrata läpikäytyä materiaalia. Yritä ymmärtää vastaukset ennen kuin jatkat seuraavaan lukuun. Vastaukset annetaan liitteessä A. Kysymyksiä 1. Millä funktiolla voit määritellä taulukon? 2. Mikä on seuraavan taulukon viimeisen alkion indeksi? $users = array("harry", "Bob", "Sandy"); 3. Mikä olisi helpoin keino lisätä arvo Susan edellä määriteltyyn taulukkoon, jos mitään funktiota ei haluta käyttää? 4. Millä funktiolla voisit lisätä merkkijonon Susan $users-taulukkoon? 5. Kuinka voisit ottaa selville taulukon alkioiden määrän?

122 7. Taulukot 6. Mikä on yksinkertaisin keino käydä läpi taulukko PHP4:ssä? 7. Millä funktiolla voisit yhdistää kaksi taulukkoa? 8. Kuinka voisit lajitella assosiatiivisen taulukon avainten mukaan? Toiminta 1. Luo moniulotteinen elokuvia sisältävä taulukko, joka on organisoitu tyypin mukaan. Taulukon avaimina tulisi olla elokuvan tyyppi, esimerkiksi "SF", "Action", "Romance" jne. Tämän assosiatiivisen taulukon jokaisen alkion tulisi sisältää elokuvien nimiä ("2001", "Alien", "Terminator" jne). 2. Tulosta edellisen tehtävän taulukon elokuvatyyppi ja siihen liittyvät elokuvat.