迴圈

電腦最厲害的,就是做重複做一模一樣流程的事情
迴圈就是幫你一直重複做某一件事情的關鍵語法

假設我們今天要印出1~100,人工一個數字一個數字打可能還打得完
但是要印出1~100000怎麼辦?
人工去打也太浪費時間了,這時候就會交給迴圈去做處理

而迴圈基本上分2種,whilefor,其他的是這兩種的變形

while迴圈

直接看while迴圈的語法:

<?php
    while(條件){
         做某些事;   
    }
?>

while迴圈的觀念很簡單,while()()內可以放「一或多個條件」
當條件為true時,迴圈內的程式碼,就會執行一次
執行一次之後,再判斷一次條件,如果條件依然是true,就再執行一次
一直重複執行,直到()內的條件為false

看一下範例

<?php
    $i = 1;
    while($i < 10){
         echo $i++;//輸出$i,並且每次+1
    }

    //output:123456789
?>

這邊要注意一下,輸出的部分是1~9,沒有10,因為$i = 10時,while會判斷$i < 10false,於是就會結束迴圈

所以如果這樣子,迴圈就不會執行,因為一開始的條件就是false

<?php
    $i = 10;
    while($i < 10){
         echo $i++;
    }

    //output:
?>

do...while迴圈

do...while迴圈是while迴圈的變形
不一樣的地方是,while每次都要判斷一次,條件為true才執行,第一次也不例外
do...while則是第一次無論如何會執行一次,第二次開始才判斷條件是否要執行
也可以說do...while就是一定會先執行一次迴圈的while

do...while的語法:

<?php    
    do{
        做某些事;   
    }while(條件);
?>

要注意一下while()後面需要加上;

看一下範例:

<?php  
    $i = 10;
    do{
       echo $i++; //輸出$i,並且每次+1
    }
    while($i < 10);

    //output:10
?>

這個範例其實跟while迴圈的最後一個範例一樣,只是改成用do...while來寫
所以第一次一定會執行,之後由於$i < 10false,迴圈就結束了

for迴圈

for迴圈的語法:

<?php  
    for(表達式1;表達式2;表達式3){
        做某些事;
    }  
?>
  • 表達式1:

迴圈最一開始時會執行表達式1,整個迴圈只會執行一次表達式1
通常會用來設定變數初始值

  • 表達式2:

在每次迴圈一開始進行條件判斷,判斷結果為true就繼續執行,false就停止迴圈

  • 表達式3:

迴圈執行一次的最後,在執行第二次之前,就會執行一次表達式3
通常會用來改變數值(更改與表達式2的條件有關的變數的數值)

所以整個迴圈會是這樣執行的(假設這回圈只執行2次)

  1. 表達式1 - 初始化變數
  2. 表達式2 - 判斷條件,結果是true
  3. 迴圈內程式碼
  4. 表達式3 - 更改數值
  5. 表達式2 - 判斷條件,結果是true
  6. 迴圈內程式碼
  7. 表達式3 - 更改數值
  8. 表達式2 - 判斷條件,結果是false
  9. 結束

講這麼多,看範例最直接

<?php
    for($i=1;$i<10;$i++){
        echo $i;
    }

    //output:123456789
?>

首先$i = 1,然後判斷$i < 10true,就執行echo $i,把$i印出來,最後再把$i增加1,變成2

接著判斷$i < 10true,再執行echo $i,把$i印出來,最後再把$i增加1,變成3

這樣的模式一直重複...

最後$i 的值被變成10時,$i < 10false,迴圈就結束了

第二個範例~,還不熟悉的可以像是上面這樣拆解看看執行流程

<?php
    for($i=0;$i<10;$i+=2){
        echo $i;
    }

    //output:02468
?>

foreach迴圈

在PHP中,foreach基本上都是用在取出陣列元素的值

取出陣列元素的值for迴圈其實也做得到,但使用foreach不需要寫初始化變數、判斷式、每次加固定的數值的程式碼...

總之foreach簡化了for迴圈的語法,變得更簡潔、清楚,大概是這樣

foreach一共有2種形式:

  • 取得索引(key)&值(value)
<?php
    foreach($array as $key => $value){
        做一些處理;
    }
?>
  • 只拿出值(value)
<?php
    foreach($array as $value){
        做一些處理;
    }
?>

Example~

<?php
    $array = ['A'=>'apple','B'=>'Bang','C'=>'cow北','D'=>'D頭'];

    foreach($array as $key => $value){
        echo 'key:'.$key.',value:'.$value;
    }

    /*output:
    key:A,value:apple
    key:B,value:Bang
    key:C,value:cow北
    key:D,value:D頭
    */

    foreach($array as $value){
        echo 'value'.$value;
    }    

    /*output:
    value:apple
    value:Bang
    value:cow北
    value:D頭
    */


?>

中斷迴圈(break)

在條件判斷文章中,有介紹到switch執行到break就會結束

而在whiledo...whileforforeach中也是一樣
但如果有多重迴圈的話,break只能結束最靠近他的迴圈

Example - while

<?php    
    $i = 1;

    while($i < 10){
        if($i == 7){
            break;//執行到這邊結束while迴圈
        }
        echo $i++;//輸出$i,並且每次+1
    }

    //output:123456
?>

代表$i的值是7的時候,就會進入if的程式區塊執行break,然後迴圈就結束了

Example - do...while

<?php    
    $i = 1;

    do{
        if($i == 7){
            break;//執行到這邊結束do...while
        }
        echo $i++;//輸出$i,並且每次+1
    }
    while($i < 10);

    //output:123456
?>

Example - for

<?php    
    for($i=1;$i<10;$i++){
        if($i == 7){
            break;//執行到這邊結束for迴圈
        }
        echo $i;
    }

    //output:123456
?>

Example - foreach

<?php    
    $array = ['A'=>'apple','B'=>'Bang','C'=>'cow北','D'=>'D頭'];

    foreach($array as $key => $value){
        if($key == 'C'){
            break;
        }
        echo 'key:'.$key.',value:'.$value;
    }

    /*output:
    key:A,value:apple
    key:B,value:Bang
    */
?>

$key是C的時候就進入if的程式區塊執行break,foreach就被結束了,所以只有印出兩行文字

多重迴圈

上面有說到,有多重迴圈的話,break只能結束最靠近他的迴圈

我們來看個for迴圈的例子

<?php
    for($i = 1;$i < 5;$i++){
        for($j = 1;$j < 5;$j++){
            echo $i.'X'.$j.'、';
        }
    }

    //output:1X1、1X2、1X3、1X4、2X1、2X2、2X3、2X4、3X1、3X2、3X3、3X4、4X1、4X2、4X3、4X4、
?>

基本上就是列出九九乘法表的1~4部分

那如果加上break

<?php    
    for($i = 1;$i < 5;$i++){
        for($j = 1;$j < 5;$j++){
            if($j==3){
                break;
            }
            echo $i.'X'.$j.'、';
        }
    }

    //output:1X1、1X2、2X1、2X2、3X1、3X2、4X1、4X2、
?>

每次$iX$j的時候,$j的值只要是3,就會結束裡面的迴圈,但是外面的迴圈沒有被結束,會繼續執行

因為break只能結束離自己最近的迴圈

跳過這次,繼續執行下一次迴圈(continue)

有的時候我們不是要停止迴圈,只是這一次不要執行了而已
continue雖然直接翻譯成中文是「繼續」,但是在程式中,意思卻是「跳過這次,直接開始執行下一次迴圈」
但如果有多重迴圈的話,只能讓最靠近continue的迴圈跳過一次

我們先把剛剛的範例的break改成continue

Example - while

<?php    
    $i = 1;

    while($i < 10){
        if($i == 7){
            continue;//執行到這邊跳過這一次迴圈,執行下一次
        }
        echo $i++;//輸出$i,並且每次+1
    }

    //output:12345689
?>

代表$i的值是7的時候,就會進入if的程式區塊執行continue,跳過這次的迴圈,直接開始執行下一次
所以印出來是12345689(沒有7)

剩下的我就不一一列出了,基本上就跟break的程式碼一樣大家可以自己在電腦上試試看

results matching ""

    No results matching ""