while-løkker while-løkker gjentar instruksjonene så lenge en betingelse er oppfylt [Kurssidene] [ ABI - fagsider bibin ] Michael Preminger (michaelp@hioa.no) 01/09-17 En liten repetisjon Løkker Arrayer (tabeller) Løkker og arrayer Avkryssingsbokser Repetisjon fra forrige gang: Betinget utføring 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 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 mappe 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 Ser på to typer løkker. while-løkke for-løkke Ordet "while" er semantisk litt misvisende: 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" <h1> En enkel while-løkke </h1> 2. $i=0;//oppstart (også: initiering eller initialisering) 3. while( $i < 5 ){ 4. print ("<p>dollar-i er nå lik $i</p>"); 5. $i = $i + 1;//oppdatering av $i - variabelen 6. } 7. print ("<p>nå er løkken slutt, fordi dollar-i er lik $i</p>"); linje 4 og 5 utføres gjentatte ganger, så lenge fortsettelsesbetingelsen (det logiske uttrykket) stemmer med virkeligheten. Linje 5 oppdaterer variabelen $i for hver omgang. Uten denne linjen blir betingelsen aldri usann (false), og løkken går evig. 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 1 of 12 01.09.2017, 12:46 2 of 12 01.09.2017, 12:46
Eksempel 2: Enda en enkel while-løkke Nedenstående eksempel skiller seg lite fra det forrige. (linje 3 og 5). <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". <h1> Enda en enkel while-løkke </h1> 2. $i=0;//oppstart (også: initiering eller initialisering) 3. while( $i < 10 ){ 4. print ("<p>dollar-i er nå lik $i</p>"); 5. $i = $i + 2;//oppdatering av $i - variabelen 6. } 7. print ("<p>nå er løkken slutt, fordi dollar-i er lik $i</p>"); Arrayer (norsk: tabeller eller matriser) En array er flere variabler som deler et variabelnavn. 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? Behandle grupper av studenter, tall, matvarer osv. på en systematisk måte. Nummer-indekserte arrayer (= sekvensielle arrayer): enhver innførsel har et nummer. Enda en enkel while-løkke 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 Bruk av logiske uttrykk i if-tester og while-løkker Legg merke til at if-tester og while-løkker bruker nøyaktig samme type logiske uttrykk if-tester, for å finne ut om en gruppe med instruksjoner skal utføres while-løkke for å finne ut om noen linjer skal utføres én gang til (og én gang til og én gang til). 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 3 : Fyll noen verdier i arrayen $studenter $studenter[0]="arne"; $studenter[1]="gerd"; $studenter[2]="mona"; 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 " ); " Arne " blir $studenter[0], " Gerd " $studenter[1] og " Mona " $studenter[2] 3 of 12 01.09.2017, 12:46 4 of 12 01.09.2017, 12:46
PHP-kommandoen count ( $array_navn ) Kommandoen count(argument) sørger for at PHP beregner antallet innførsler i arrayen hvis navn oppgis som argument. PHP- legger så resultatet i returvariabelen. I eksempelet nedefor heter denne $hvormangestudenter. Eksempel 4 : Finn ut størrelsen på arrayen $studenter (argumentet her er $studenter) $hvormangestudenter=count($studenter); print("$hvormangestudenter studenter er registrert i arrayen"); Resultat: 3 studenter er registrert i arrayen 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]). Nyttig: Legge array-inførsler i en lang, mellomrom-separert streng. Funksjonen join(" ", $array) kan brukes til å slå sammen array-innførsler til en mellomrom-separert streng Det neste eksemplet bruker arrayen som er også brukt i de forrige eksemplene. Eksempel 5: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". 2. $strengarray[0] = "Michael"; 3. $strengarray[1] = "Jens"; 4. $strengarray[2] = "Arne"; 5. $strengarray[3] = "Rita"; 6. $langstreng = join(" ", $strengarray); 7. print("langstreng = $langstreng") ; Arrayer og løkker Arrayer kan behandles systematisk i løkker. Eksempel 6: Legger inn, og skriv ut tre innførsler i arrayen $studenter. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". 2. $studenter=array("arne", "Gerd", "Mona"); 3. print("<p>her kommer student-utskriften:</p>\n"); 4. $i = 0; 5. $antall = count($studenter); // "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.?> I nettleservinduet : Her kommer student-utskriften: 0: Arne 1: Gerd 2: Mona ingen flere studenter i arrayen. Resultatet: langstreng=michael Jens Arne Rita 5 of 12 01.09.2017, 12:46 6 of 12 01.09.2017, 12:46
Form-elementer som bruker arrayer Kortform for inkrementering* Avkryssingsbokser- ikke utelukkende verdier som kan henge sammen Avkryssingsboks ligner på radioknapper, men innførslene her er ikke gjensidig utelukkende. Eksemplet nedenfor har 3 avkryssingsbokser som angir matretter det kan velges blant. Eksempel 7: Arrayen $_GET['mat'] i php-programmet respons_cb.php får like mange innførsler som det antallet avkryssingsbokser vi krysser av på. Hvis vi krysser av 2 av matrettene, får arrayen $_GET['mat'] i php-programmet 2 innførsler: $_GET['mat'][0] og $_GET['mat'][1]. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". <form action="respons_cb.php"> Hva spiser du helst? <p>hva spiser du helst? </p> Fisk <p><input type="checkbox" name="mat[]" value="fisk" /> Fisk</p> Lam <p><input type="checkbox" name="mat[]" value="lam" /> Lam</p> Ris <p><input type="checkbox" name="mat[]" value="ris" /> Ris</p> <input type="submit" /> </form> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". 1. <h1> Hva studenten spiser</h1> 2. <?php 3. $i = 0; 4. $antall = count($_get['mat']); 5. print("<p>arrayen dollar-mat har $antall innførsler:</p>"); 6. while ($i < $antall){ 7. print ("<p>$i: {$_GET['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 (arrayer har 0 som første innførsel). På linje 4 finner programmet antallet avkryssingsbokser brukeren har krysset av Linje 7 og 8 gjentas s å lenge fortsettelsesbetingelsen i linje 6 holder. *Inkrementering (på dataspråket) = det å øke et tall med 1. ++ operatoren brukes istedenfor den litt lengre formen $i = $i + 1 $i = $i + 1 (inkrementering) er en meget vanlig handling i php (og andre språk). Den kan også skrives slik: $i++; ++ brukes både i while og for-løkker Eksempel 8: gjentagelse av eksempel 1, men med den nye operatoren <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". 2. $i=0;//oppstart 3. while( $i < 5 ){ 4. print ("<p>dollar-i er nå lik $i</p>"); 5. $i++ ;//oppdatering av $i 6. } 7. print ("<p>nå er løkken slutt, fordi dollar-i er lik $i</p>"); Eksempel 9: gjentagelse av et tidligere eksempel, men med den nye operatoren <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". 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++ //øk verdien til $i med èn (inkrementering) 9. } 10. print("<p>ingen flere studenter i arrayen.</p>\n"); 11.?> lilla bakgrunn på linje 5 (over) og 8. OBS!! Det heter $i++ (ikke $i = $i++) 7 of 12 01.09.2017, 12:46 8 of 12 01.09.2017, 12:46
Nøsting av løkker Vi kan nøste løkker inn i hverandre for å behandle nøstede strukturer. Anta en høgskole. Går gjennom alle klasser. Innenfor hver klasse skriver ut navnene på alle studenter. studentløkken (8-12) nøsted inn i en klasseløkken (5-14) <?php 1. $antall_klasser=30; 2. //anta at alle klasser er like tallrike 3. $antall_elever_i_klassen=28; 4. $i=0; 5. while ( $i < $antall_klasser ){ //ytre løkke 6. $j=0; 7. skriv ut navnet til den $i te klassen 8. while ( $j < $antal_elever_i_klassen ){ //indre løkke 9. ( innrykk ) skriv ut fornavnet og etternavnet 10. til den $j te eleven 11. $j++; 12. } 13. $i++; 14. }?> Ser slikt ut i utskrift: Klasse 1A Joakim Hansen Harald Jensen Anita Strøm Klasse 1B Bernt Myhre Et enklere eksempel på nøsting (om enn ikke så nyttig) er multiplikasjonstabellen. 9 of 12 01.09.2017, 12:46 10 of 12 01.09.2017, 12:46
Eksempel 10 : multiplikasjonstabellen i PHP (fritt etter Horgen (2005)) Klikk her for en version som kan brukes direkte i øvelsesoppgave 4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". <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 Programmet går gjennom alle radene i multiplikasjonstabellen. (ytre løkke) I hver rad går programmet gjennom alle kolonnene (indre løkke) avslutter hver rad med </tr> (linje 13) 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 36 9 121518212427 4 8 12 16 20 24 28 32 36 51015202530354045 61218243036424854 71421283542495663 81624324048566472 91827364554637281 Avbryte en løkke med break Dette utelates fra forelesningsstoffet. Interesserte kan lese i kompendiet, avsn. 4.5.1. Ukens lab-oppgaver Følgende skal øves inn: If setninger while-løkker for-løkker (*) arrayer basert på avkryssingsbokserbokser Referanser Horgen, S. A.(2014). Webprogrammering i PHP. (4. utg.). Trondheim:Tisip Gyldendal akademisk. Sist oppdatert 01/09-17 av Michael Preminger, michael.preminger@jbi.hio.no 11 of 12 01.09.2017, 12:46 12 of 12 01.09.2017, 12:46