Page 1 Page 2 [Kurssidene] [ JBI] [ ] Utvikling av dynamiske nettsteder med PHP og databaser, høsten 2006 Vi kommer for det meste til å bruke while-løkker, men for-løkker anses viktige å kjenne til Michael Preminger (michaelp@hio.no) 18/09-06 I denne forelesningen En liten repetisjon Løkker Arrayer (tabeller) Løkker og arrayer Avkryssingsbokser Repetisjon fra forrige gang Betinget utføring Betinget utføring gir oss mulighet til å kontrollere programmets funksjon gjennom beslutniger. Programmet beslutter hvilke kodebiter skal og skal ikke utføres, ved å teste på betingelser. Slike betingelser er mer eller mindre kompliserte logiske uttrykk som koker ned til true eller false. Løkker (Se også Lash (2003), s. 50-54) Med løkker kan vi gjenta en sekvens av instruksjoner flere ganger. Ofte trenger vi gjenta handlinger for alle studenter i en klasse alle tekstlinjer i en fil alle filer i en katalog Løkker gir oss mulighet til å skrive programkode for en handling (vi skriver den bare én gang) få handlingen gjentatt det nødvendige antallet ganger I denne forelesningen ser vi på to typer løkker. while-løkke for-løkke
Page 3 Page 4 While løkker While-løkker gjentar instruksjonene så lenge en betingelse er oppfylt En enkel while-løkke dollar-i er nå lik 0 dollar-i er nå lik 1 dollar-i er nå lik 2 dollar-i er nå lik 3 dollar-i er nå lik 4 Nå er løkken slutt fordi dollar-i er lik 5 De 5 første omgangene er betingelsen oppfylt, og dermed kjøres løkke-koden. Eksempel 2: Enda en enkel while-løkke Ordet "while" er semantisk litt misvisende: Nedenstående eksempel skiller seg lite fra det forrige. (linje 3 og 10). på norsk kan man si : "Så lenge $i er mindre enn 5, gjenta disse instruksjonene" Eksempel 1: en enkel while-løkke En enkel while løkke skrives på følgende vis: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> <title>en enkel while-løkke</title> <link rel="stylesheet" href="stilark.css" type="text/css" /> </head> <h1> En enkel while-løkke </h1> 2. $i=0;//oppstart (også: initiering eller initialisering) 3. while( $i < 5 ){ <h1> Enda en enkel while-løkke </h1> 2. $i=0;//oppstart (også: initiering eller initialisering) 3. while( $i < 10 ){ 5. $i = $i + 2;//oppdatering av $i - variabelen Enda en enkel while-løkke 5. $i = $i + 1;//oppdatering av $i - variabelen dollar-i er nå lik 0 dollar-i er nå lik 2 dollar-i er nå lik 4 dollar-i er nå lik 6 dollar-i er nå lik 8 Nå er løkken slutt fordi dollar-i er lik 10 linje 2 tilrodner variabelen $i en oppstartverdi på 0 Bruk av logiske uttrykk i if-tester og while-løkker linje 4 og 5 utføres gjentatte ganger, så lenge fortsettelsesbetingelsen (det logiske Legg merke til at if-tester og while løkker bruker nøyaktig samme type logiske uttrykk uttrykket) stemmer med virkeligheten. if-tester, for å finne ut om en gruppe med instruksjoner skal utføres Line 4 er vår "nyttehandling". Den printer verdien til nettleservinduet. Linje 5 oppdaterer variabelen $i for hver omgang. Uten denne linjen blir betingelsen aldri usann (false), og løkken går evig. while-løkke for å finne ut om noen linjer skal utføres én gang til (og én gang til og én gang til). etter 5 omganger, når $i==5, er ikke betingelsen sann lenger, og løkken avbrytes. Resultatet:
Page 5 Page 6 For-løkker - innføring og eksempel Forskjellen mellom while og for-løkker For-løkker gjentar instruksjonene et gitt antall ganger. En for-løkke er strukturert. All styringen ligger mellom klammene For-løkkens oppbygging: (Oppstart, fortsettelsesbetingelse, oppdatering) er konsentrert mellom klammene, rett etter for - ordet. Mellom krøllklammene har vi bare handlingene som skal utføres. "Parentesen" i en while løkke oppgir bare en fortsettelsesbetingelse. Oppstart må ordnes før løkkekoden starter (se linje 2 nedenfor) oppdatering må ordnes som en del av løkkens "nyttekode" (mellom { og } ), stort sett etter at nytten er gjort. Eksempel 3: en enkel for-løkke 2. print("<p>her kommer en for-løkke</p>"); 3. for ( $i = 0 ; $i < 5 ; $i = $i + 1 ){ 5. } 6. print ("<p>nå er løkken slutt, fordi dollar-i er lik $i</p>"); 7.?> Linje 3 kontrollerer løkkens gang i = 0 oppstart - tellervariabelen $i får en startverdi $i < 5 forsettelsesbetingelsen - et logisk uttrykk $i = $i + 1 oppdatering - for hver omgang, vokser verdien i $i med 1 Det logiske uttrykket testes hver omgang, for å beslutte om løkken skal utføres en omgang til. resulterer i at følgende skrives til nettleseren: Her kommer en for-løkke dollar-i er nå lik 0 dollar-i er nå lik 1 dollar-i er nå lik 2 dollar-i er nå lik 3 dollar-i er nå lik 4 Begge løkketyper kan, i prinsippet brukes i alle situasjoner som krever løkker Vi bruker ofte for-løkker når vi vet hvor mange ganger løkken skal kjøres. Vi bruker while - løkker når antall ganger løkken kjøres avhenger av ting som skjer underveis i løkkekoden. En kommentar: Dere kommer stort sett til å bruke while-løkker i deres arbeid. For-løkken er viktig å kjenne til for de av dere som skal programmere senere. Mange eksempler kommer i fortsettelsen, oftest med while-løkker Eksempel 4:(Gjentar eksempel 2) <h1> Enda en enkel while-løkke </h1> 2. $i=0;//oppstart 3. while( $i < 10 ){ 5. $i = $i + 2;//oppdatering av $i - variabelen For løkken er lettere å programmere med, men vanskeligere å forstå. Dette fordi mange av detaljene, som programmereren selv må holde styr på, i og rundt while-løkker, "abstraheres vekk" i for-løkken. Nå er løkken slutt fordi dollar-i er lik 5
Page 7 Page 8 Arrayer (norsk: tabeller eller matriser) En array er flere variabler som deler et variabelnavn. vi kommer til å bruke ordet array, for å unngå sammenblanding med HTML-tabeller En array er flere variabler som er gruppert sammen under sammen navn. Enhver slik variabel kaller vi en array-innførsel ("array item" eller "array entry" på engelsk). Hvorfor trenger vi arrayer? Arrayer tillater oss å behandle grupper av studenter, tall, matvarer osv. på en systematisk måte. Finnes flere typer arrayer i PHP. Vi starter med nummer-indekserte arrayer. Enhver array-innførsel har et nummer. En nummer-indeksert array kan beskrives på følgende måte: Legg merke til at når arrayen har 3 innførsler, er det høyeste innførselnummer 2, og ikke 3. ([0], [1] og [2]) En kort notasjon for å befolke en array med verdier Følgende kode befolker en array med noen få verdier, uten å oppgi indeksene. Verdiene får automatisk indekser fra 0 og oppover. Eksemplet lager samme array som forrige eksempel. $studenter=array("arne", "Gerd", "Mona"); Linjen plasserer "Arne" som $studenter[0], "Gerd" dom $studenter[1] og "Mona" som $studenter[3] Arrayer og løkker Arrayer kan behandles systematisk i løkker. Eksempel 7: Følgende program legger inn, og skriver ut de tre innførslene i arrayen $studenter arrayinnførslene skrives på følgende måte: $studenter[0], $studenter[1], $studenter[2] osv. Enhver array-innførsel kan få tilordnet en verdi, uavhengig av de andre innførslene: Eksempel 5 : Fyll noen verdier i arrayen $studenter $studenter[0]="arne"; $studenter[1]="gerd"; $studenter[2]="mona"; PHP-kommandoen count($array_navn) Kommandoen count(argument) sørger for at PHP beregner antallet innførsler i arrayen hvis navn oppgis som argument. Dette kaller vi en funksjon, og kommer tilbake til senere. PHP- legger så resultatet i returvariabelen I eksempelet nedefor heter denne $ hvormangestudenter. Eksempel 6 : Finn ut størrelsen på arrayen $studenter (argumentet her er $studenter) $hvormangestudenter=count($studenter); print("$hvormangestudenter studenter er registrert i arrayen"); 2. $studenter=array("arne", "Gerd", "Mona"); 3. print("<p>her kommer student-utskriften:</p>\n"); 4. $i = 0; 5. $antall = count($studenter);// kommandoen count teller antall inførsler i arrayen 6. while ($i < $antall){ 7. print("<p>$i: $studenter[$i]</p>\n"); 8. $i = $i + 1;//øk verdien til $i med èn (inkrementering) 9. } 10. print("<p>ingen flere studenter i arrayen.</p>\n"); 11.?> Resultater ser ut som følger: Her kommer student-utskriften: 0: Arne 1: Gerd 2: Mona ingen flere studenter i arrayen. Resultat: 3 studenter er registrert i arrayen
Page 9 Page 10 Form-elementer som bruker arrayer Kortform for inkrementering Avkryssingsbokser- ikke utelukkende verdier som kan henge sammen ++ operatoren brukes istedenfor den litt lengre formen $i = $i + 1 Avkryssingsboks ligner på radioknapper, men innførslene her er ikke gjensidig utelukkende. $i = $i + 1 (inkrementering) er en meget vanlig handling i php (og andre språk). Eksemplet nedenfor har 3 avkryssingsbokser som angir matretter det kan velges blant. Den kan også skrives slik: $i++; Eksempel 10: $i++ betyr: øk $i med 1. Legg merke til at arrayen $mat i php-programmet respons_cb.php får like mange innførsler som det antallet avkryssingsbokser vi krysser av på. Det vil si at hvis vi krysser av 2 av matrettene, får arrayen $mat i php-programmet 2 innførsler: $ mat[0] og $mat[1]. Hva spiser du helst? Fisk Lam Ris Submit <form action="respons_cb.php"> <p>hva spiser du helst? </p> <p><input type="checkbox" name="mat[]" value="fisk" /> Fisk</p> <p><input type="checkbox" name="mat[]" value="lam" /> Lam</ p> <p><input type="checkbox" name="mat[]" value="ris" /> Ris</p> <input type="submit" /> </form> 1. <h1> Hva studenten spiser</h1> 2. <?php 3. $i = 0; 4. $antall = count($mat); 5. print("<p>arrayen dollar-mat har $antall innførsler:</p>"); 6. while ($i < $antall){ 7. print ("<p>$i: $mat[$i]</p>\n"); 8. $i = $i + 1; 9. } 10.?> Linje 2 og 10 omslutter PHP-blokken Linje 3 tilordner variabelen $i en starverdi 0, da alle våre arrayer har første innførsel på 0. På linje 4 finner programmet ut hvor mange avkryssingsbokser brukeren har krysset av Linje 6-9 utgjør while-løkken. Linje 7 og 8 gjentas så lenge fortsettelsesbetingelsen i linje 6 holder. ++ brukes både i while og for-løkker Eksempel 11: gjentagelse av eksempel 1, men med den nye operatoren 2. $i=0;//oppstart 3. while( $i < 5 ){ 5. $i++ ;//oppdatering av $i Eksempel 12: gjentagelse av et tidligere eksempel, men med den nye operatoren 2. $studenter[0]="arne"; 3. $studenter[1]="gerd"; 4. $studenter[2]="mona"; 5. print("<p>her kommer student-utskriften:</p>\n"); 6. $i = 0; 7. $antall = count($studenter);// kommandoen count teller antall inførsler i arrayen 8. while ($i < $antall){ 9. print("<p>$i: $studenter[$i]</p>\n"); 10. $i++;//øk verdien til $i med èn (inkrementering) 11. } 12. print("<p>ingen flere studenter i arrayen.</p>\n"); 13.?> Se skrift med lilla bakgrunn på linje 4 (over) og 10. Legg merke til at det heter $i++ (ikke $i = $ i++)
Page 11 Page 12 Nøsting av løkker Vi kan nøste løkker inn i hverandre for å behandle nøstede strukturer. Anta en høyskole. Vi går gjennom alle klasser. Innenfor hver klasse skriver vi ut navnene på alle studenter. Løkken som behandler alle studenter i en klasse er nøsted inn i en løkke som går gjennom alle klasser Et enklere eksempel på nøsting (om enn ikke så nyttig) er multiplikasjonstabellen. Eksempel 13: multiplikasjonstabellen i PHP (fritt etter Horgen (2005)) Klikk her for en version som kan brukes direkte i øvelsesoppgave 4 <h1>multiplikasjonstabellen</h1> 2. print( "<table>"); 3. $ytre_teller = 1;//oppstart på første rad 4. while ($ytre_teller <= 9) { 5. print("<tr>"); //starter en rad 6. $indre_teller = 1; //oppstart: første kolonne i raden 7. while ($indre_teller <= 9) { //indre, nøstet løkke (kolonnene) 8. $tall = $indre_teller * $ytre_teller; 9. print("<td>$tall</td>"); 10. $indre_teller++; 11. }//lukker den indre, nøstede løkken 12. //er nå ferdig med å lage neste rad 13. print ( "</tr>");//avslutter en rad 14. $ytre_teller++; 15. }//lukker ytre løkke 16. /*ferdig med alle radene, kan avsutte tabellen*/ 17. print ( "</table>"); 1 Multiplikasjonstabellen 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 Ukens lab-oppgaver Følgende skal øves inn: While-løkker For-løkker (*) Arrayer basert på avkryssingsbokserbokser Referanser Horgen, Svend Andreas (2005): Webprogrammering i PHP. - Gyldendal Norsk Forlag - 408 s. - ISBN: 82-05-34578-3 Sist oppdatert 18/09-06 av Michael Preminger, michael.preminger@jbi.hio.no Programmet går gjennom alle radene i multiplikasjonstabellen. (ytre løkke) I hver rad går programmet gjennom alle kolonnene (indre løkke) Når programmet er ferdig med en rad, avslutter den raden med </tr> (linje 11) Dette får vi bruk for når vi driver med databasetabeller.