PHP與MySQL 入門學習指南

Save this PDF as:
 WORD  PNG  TXT  JPG

Size: px
Start display at page:

Download "PHP與MySQL 入門學習指南"

Transcription

1 資訊管理學系 授課教師 : 黃元巨博士

2 第 12 章迴圈指令

3 本章大綱 12 1 FOR 迴圈 12 2 巢狀 FOR 迴圈 12 3 FOREACH 迴圈 12 4 WHILE 迴圈 12 5 BREAK 12 6 CONTINUE 問題與討論

4 12 1 FOR 迴圈 使用迴圈指令來解決重複計算的問題 已知迴圈的起始值及終止值, 或已知需要的迴圈次數時, 我們會使用 FOR 指令 格式如下 : for ( 起始值 ; 迴圈判斷條件 ; 增減值 ) { 迴圈敘述 } 起始值是在 for 指令一開始時設定所需指標變數或運算的值 - 迴圈判斷條件是用來判斷 for 迴圈是否要繼續執行的依據 依增減值改變變數內容

5 1: <html> 2: <title>for 迴圈 </title> 3: <body> 4: <?php 5: for ($A = 0 ; $A<=10 ; $A++) { 6: echo "$A " ; 7: echo "<br>" ; 8: } 9:?> 10: </body> 11: </html> 第 5 行 for 迴圈起始值為 $A=0, 迴圈判斷條件是 $A<=10, 增減值為 $A++ 第 6-7 行為迴圈敘述, 顯示 $A 的內容 第 8 行迴圈結束

6 1: <html> 2: <title> 遞減迴圈 </title> 3: <body> 4: <?php 5: for ($A = 10 ; $A>=0 ; $A--) 6: echo "$A <br>" ; 7:?> 8: </body> 9: </html> 遞減範例 $A 起始值設為 10, 每次迴圈 $A 減 1, 直到判斷條件 $A>=0 不成立為止

7 1: <html> 2: <title> 迴圈應用 </title> 3: <body> 4: <?php 5: $Week[0] = "Sunday" ; // 設定陣列 Week 的內容 6: $Week[1] = "Monday" ; 7: $Week[2] = "Tuesday" ; 8: $Week[3] = "Wednesday" ; 9: $Week[4] = "Thursday" ; 10: $Week[5] = "Friday" ; 11: $Week[6] = "Saturday" ; 12:?> 13: <table border=5 width=560> 14: <tr> 15: <?php 16: for ($A=0 ; $A <=6; $A++) 17: echo "<td width=80>$week[$a]</td> " ; 18:?> 19: </tr> 20: </table> 21: </body> 22: </html> 程式的第 5-11 行設定陣列的內容 第 行是一個 HTML 標籤, 表示一個表格的開始, 並且設定表格的屬性邊線 (border) 的寬度為 5, 表格的總寬度為 560 <tr> 表示表格中一列的開始 第 16 行設定一個迴圈使得 $A 由 0 到 6 第 17 行 <td> 表示表格中一個欄位的開始, 並設定欄位的寬度為 80, 然後顯示 $Week 陣列的內容 $A 的值由 0 開始, 所以先擷取 $Week[0] 的值即 "Sunday" 顯示在網頁上, </td> 則表示一個欄位的結束 然後 $A 的值加 1, 其值小於 6 迴圈繼續執行 <td> 又設定一個欄位的開始, 並擷取 $Week[1] 的值, 依此類推直到迴圈結束 此時網頁上會出現星期日到星期六 第 20 行 </td> 表示一個列結束 第 21 行 </table> 則是表格的結束

8 1: <html> 2: <title> 迴圈 </title> 3: <body> 4: <?php 5: $Week[0] = "Sunday" ; // 設定陣列 Week 的內容 6: $Week[1] = "Monday" ; 7: $Week[2] = "Tuesday" ; 8: $Week[3] = "Wednesday" ; 9: $Week[4] = "Thursday" ; 10: $Week[5] = "Friday" ; 11: $Week[6] = "Saturday" ; 12:?> 13: <table border=0 width=560> 14: <tr> 15: <?php 16: for ($A=0 ; $A <=6; $A++) 17: echo "<th width=80>$week[$a] " ; 18: echo "<tr>" ; 19: for ($I=1 ; $I<=31; $I++){ 20: echo "<td align=center>$i" ; 21: if ($I % 7 == 0 ) 22: echo "<tr>" ; 23: } 24:?> 25: </table> 26: </body> 27: </html> 第 18 行表示下一列的開始 第 19 行是一個 for 迴圈,$I 由 1 到 31 表示一個月的 31 天 每一個日期要放置在一個欄位中, 所以在第 20 行 <td> 表示一個欄位的開始, align 屬性則表示顯示的文字要在欄位的中央 (center), 接著顯示日期 $I 因為一週是七天, 所以每七天就應該要換到下一列顯示, 所以第 21 行 if 判斷式來判斷是否換到下一列 觀念是當 $I 可被 7 整除時就表示已經顯示過 7 個日期應該要換到下一列 所以當 if 判斷式為真時, 第 22 行以 <tr> 標籤產生新的一列. 月曆雛型

9 特殊的 FOR 迴圈 a) for ($i=0; $i<=10 ; $i ) b) for ( ; ; ) c) for ($i=0 ; $i<=10; $j++) 以上所有的 for 指令假設在迴圈敘述內不會改變 $i 的值, 那麼三個 for 迴圈都是無窮迴圈

10 for ($i=0; $i<=10 ; $i ) 因為 $I 從 0 開始, 而每迴圈一次 $I 的值都要遞減 1, 那麼 $I 的值永遠小於 10, 因此 $i<=10 永遠為真而產生無窮迴圈

11 for ( ; ; ) 因為 for 迴圈三項條件均沒有設定, 因此沒有離開迴圈的條件而產生無窮迴圈

12 for ($i=0 ; $i<=10; $j++) 第三項增減值是變數 $j 做遞增 而 $i 的起始值設為 0 後就沒有再改變過, 那麼 $i 的值當然永遠小於 10, 迴圈自然沒有機會停止

13 12 2 巢狀 FOR 迴圈 for 迴圈內還可以有 for 迴圈 格式 for ($I=0; $I<=10; $I++){ echo $I; for ($J=1; $J<=9; $J++) echo $J; }

14 1: <html> 2: <title> 統計表 </title> 3: <body> 4: <?php 5: $s = array (0,15,10,20,17,3,8) ; 6: echo " 銷售量統計表 <p>" ; 7: for ($A=1 ; $A<=6; $A++){ 8: echo " 星期 $A : " ; 9: $s[0]+=$s[$a] ; 10: for ($I=1 ; $I<= $s[$a]; $I++) 11: echo "*" ; 12: echo " $s[$a]<br>" ; 13: } 14: echo "<p> 總量 : $s[0]" ; 15:?> 16: </body> 17: </html>

15 1: <html> 2: <title> 統計表 </title> 3: <body> 4: <?php 5: $s = array (0,15,10,20,17,3,8) ; 6: echo " 銷售量統計表 <p>" ; 7: for ($A=1 ; $A<=6; $A++){ 8: echo " 星期 $A : " ; 9: $s[0]+=$s[$a] ; 10: for ($I=1 ; $I<= $s[$a]; $I++) 11: echo "*" ; 12: echo " $s[$a]<br>" ; 13: } 14: echo "<p> 總量 : $s[0]" ; 15:?> 16: </body> 17: </html> $s[0] 用來計算並儲存一週的總銷售量 $s[1] 到 $s[6] 則分別儲存星期一到星期六的銷售量 第 5 行設定了 $s 為一個陣列 第 7 行是 for 迴圈使得 $A 由 1 遞增到 6 第 8 行顯示星期 第 9 行將每天的銷售量加總到 $s[0] 第 10 行設定一個內迴圈使得 $I 的值由 1 遞增到 $s[$a] 例如 $A=1 時, $s[$a] 就表示取得 $s[1] 的內容, 而 $s[1] 的內容為 15, 所以內迴圈會由 1 遞增到 15 第 11 行顯示一個 "*" 字元, 當內迴圈由 1 到 15 則第 11 行會被執行 15 次, 故顯示 15 個 "*" 因為迴圈並沒有加上大括弧所以迴圈敘述只有一行, 也就是說第 12 行並沒有包含在迴圈敘述中, 所以當 $I 迴圈執行完畢後才會執行第 12 行顯示 $s[1] 的內容, 然後由標籤 <br> 表示換到下一行 依此重複執行, 直到迴圈結束 最後第 14 行顯示 $s[0] 的內容, 就是本星期的銷售總量

16 12 3 FOREACH 迴圈 foreach, 專門使用在陣列操作 二種格式分述如下 : 1) foreach (array_expression as $value) 2) foreach (array_expression as $key => $value)

17 1) foreach (array_expression as $value) 格式 foreach ( 陣列名稱 as $value){ 迴圈敘述 ; } 在執行時陣列的 index 先歸零, 意即 index 指向陣列第 0 個元素 ( 因為陣列從 0 開始 ), 然後每次迴圈依序將陣列元素的內容放入 $value 變數中, 直到陣列中每一個元素都執行一次

18 1: <html> 2: <title>foreach</title> 3: <body> 4: 月份縮寫 : <br> 5: <?php 6: $month = array('jan','feb','mar','apr','may','jun','jul','aug', 7: 'Sep','Oct','Nov','Dec') ; 8: foreach ($month as $value) 9: echo "$value <br> " ; 10:?> 11: </body> 12: </html> 第 6-7 行設定陣列 $month 的內容 第 8 行 foreach 會先將 index 歸零, 然後依陣列內容 'Jan','Feb'... 之順序, 依序代入 $value 中 第 9 行顯示 $value 內容 陣列內容有 12 個元素, 所以迴圈會執行 12 次

19 2) foreach (array_expression as $key => $value) 格式 foreach ( 陣列名稱 as $key => $value) { 迴圈敘述 ; } 第二種方式除了會將陣列元素依序存入 $value 外, 也會將陣列指標 index 同時存入 $key 中

20 1: <html> 2: <title>foreach</title> 3: <body> 4: <?php 5: $A = array (0,10,20,30,40,50,60) ; 6: foreach ($A as $key => $value){ 7: echo "\$A[$key] : " ; 8: echo "$value <br> " ; 9: } 10:?> 11: </body> 12: </html> 第 5 行設定陣列 $A 的內容 第 6 行將陣列 $A 中元素依序取出 陣列元素的 index 值放入 $Key, 元素的內容放到 $value 中 第 7 行顯示 $Key ( 即 index) 第 8 行顯示 $value

21 12 4 WHILE 迴圈 While 指令有二個格式 While... do... While 二者的差別是在於, 前者是先判斷條件判斷式是否為真才執行迴圈敘述, 而後者是先執行迴圈再判斷條件判斷式是否為真, 然後才決定是否繼續執行迴圈

22 While... 格式 : while ( 判斷式 ) { 迴圈敘述 } 當 while 後面的判斷式為真時, 會重複的執行迴圈敘述, 一直到判斷式結果為假 迴圈敘述是由左右大括弧將敘述括起來 如果迴圈敘述只有一行敘述就可以省略大括弧 While 迴圈每次會在一開始時檢查判斷式, 每次一定會執行完迴圈敘述一次再回到迴圈的開始, 也就是說, 如果迴圈敘述執行到一半時即使判斷式變成假也不會停止, 直到做完迴圈後才會再檢查判斷式

23 1: <html> 2: <title>while 迴圈 </title> 3: <body> 4: WHILE 開始時判斷式為真 <br> 5: <?php 6: $A = 1; 7: while ($A<=10) 8: echo $A++."<br>" ; 9:?> 10: <hr>while 開始時判斷式為假 <br> 11: <?php 12: $A=20 ; 13: while ($A<=10) 14: echo $A++."<br>" ; 15:?> 16: </body> 17: </html> 第 6 行設定 $A=1 第 7 行 while 因為 1<10 所以判斷式為真, 就會進入迴圈敘述內執行 第 8 行顯示 $A 的內容並且將 $A 的值加 1, 然後回到第 7 行在判斷是否執行 while 迴圈 如此循環一直到 $A 的值遞增到 11, 使得判斷式為假就不會再執行迴圈 此時畫面上已顯示 1 到 10 接著第 10 行顯示出一條分隔線以及提示字串 第 12 行設定 $A=20 第 13 行因為 $A 的值為 20 不會小於或等於 10, 所以判斷式為假, 迴圈敘述就不會被執行, 畫面上自然不會顯示出任何結果 這個範例執行結果可以看到當判斷式為真時, 由 1 依序顯示到 10 當判斷式為假時就沒有顯示任何東西

24 do... while 格式 : do { 迴圈敘述 }while ( 判斷式 ) ; 迴圈一開始並沒有任何的判斷式, 因此直接進入迴圈敘述內執行 然後才檢查判斷式的結果為真或是為假, 如果為真則繼續進行迴圈敘述, 如果為假則離開迴圈 和 while 迴圈最大的不同是不管判斷式是真或是假, 一開始一定會執行迴圈敘述一次才會檢查判斷式的值 所以 do...while 是先執行迴圈再判斷條件判斷式是否為真, 然後才決定是否繼續執行迴圈

25 1: <html> 2: <title>do_while 迴圈 </title> 3: <body> 4: Do-WHILE 當判斷式為真 <br> 5: <?php 6: $A = 1; 7: do { 8: echo $A++."<br>" ; 9: } while ($A<=10) ; 10:?> 11: <hr>do-while 當判斷式為假 <br> 12: <?php 13: $A=20 ; 14: do { 15: echo $A++."<br>"; 16: }while ($A<=10) 17:?> 18: </body> 19: </html> 第一個 do_while 迴圈第 7 行只是表示迴圈的開始並沒有判斷, 程式會直接進入第 8 行顯示 $A 的內容並且將其值加 1 第 9 行 while 判斷 $A 是否小於或等於 10 迴圈會一直執行到判斷式為假為止 第 13 行第二個迴圈 $A 的值為 20 第 14 行表示迴圈開始並沒有判斷, 進入第 15 行顯示 $A 的值 ( 即 20) 然後加 1 第 16 行進行判斷式的檢查, 發現判斷式為假, 所以立即離開迴圈向下執行 此時畫面上已顯示一個 20

26 12 5 BREAK Break 指令會強迫跳離 for while 迴圈及 switch 指令 格式如下 : break n ; brea k 的用法相當簡單, 只要將 break 指令寫在要強迫跳離迴圈的地方就可以了 參數 n 表示跳離迴圈的深度

27 1: <html> 2: <title>break</title> 3: <body> 4: <?php 5: $A=1 ; 6: for ( ; ; ){ 7: echo $A++."<br>" ; 8: if ($A > 10) break ; 9: } 10:?> 11: </body> 12: </html> 第 6 行 for 指令中沒有寫條件式, 在前面我們曾經說明過這樣的寫法就會形成一個無窮迴圈, 原則上這個迴圈應該不會停止 但是第 8 行 if 判斷式使得當 $A 的值大於 10 時就會執行 break 指令跳離 for 迴圈

28 1: <html> 2: <title>break</title> 3: <body> 4: <?php 5: echo "======= break ======= <br>\n" ; 6: for ($A=1; $A<=3; $A++) { // 第一層迴圈 7: for ($B=1; $B<=10 ; $B++) { // 第二層迴圈 8: echo "A = $A B=$B <br>\n" ; 9: if ($B==3) break ; 10: } 11: echo " <br>" ; 12: } 13: echo "<p>"; 14: echo "====== break 2 ====== <br>\n" ; 15: for ($A=1; $A<=3; $A++) { // 第一層迴圈 16: for ($B=1; $B<=10 ; $B++) { // 第二層迴圈 17: echo "A = $A B=$B <br>\n" ; 18: if ($B==3) break 2 ; 19: } 20: } 21:?> 22: </body> 23: </html> 跳二層 跳一層

29 12 6 CONTINUE continue 指令會忽略 continue 以下的迴圈敘述回到迴圈起始位置繼續執行迴圈 格式 continue n ; continue 指令會忽略所在位置以下的迴圈敘述回到迴圈起始位置繼續執行迴圈 n 代表跳離的層數, 當 n 忽略不寫時表示 n=1

30 1: <html> 2: <title>continue</title> 3: <body> 4: <?php 5: $A=0 ; 6: while ($A < 9) { 7: $A++; 8: echo "<br>$a \n" ; 9: if (($A % 2) ==0) 10: continue ; 11: echo "<== 是奇數 " ; 12: } 13:?> 14: </body> 15: </html> 第 5 行 $A 的初始值為 0 第 6 行 while 迴圈判斷 $A 是否小於 9 第 7 行 $A 的值加 1 第 8 行顯示 $A 的內容 第 9 行如果 $A 對 2 取餘數為 0 則執行 continue 第 11 行顯示文字說明字串

31 問題與討論 1. 請利用 FOR 指令在瀏覽器上顯示 0 至 20 間的奇數 2. 請撰寫一個程式可以顯示九九乘法表 3. 請用 FOREACH 改寫範例 請利用 WHILE 指令改寫第一題 5. 請利用 DO WHILE 指令改寫第二題 6. 請寫一個教學網頁, 由使用者輸入一個數字 N, 則可以顯示 : a) ΣN (1 至 N 的和 ) b) N! (1 至 N 的積 ) c) 小於 N 的費式級數 ( 級數 : ) 注意, 程式需判斷 N 不可以小於 5