進度條

【PHP】20. 迴圈的中斷(continue & break)

【PHP】20. 迴圈的中斷(continue & break)

作者: 進度條編輯群 更新日期:

此文章也有影片介紹,可以搭配影片一起學習!

01. 迴圈的中斷(continue & break) (所屬課程)

02. 迴圈的中斷(continue & break) (所屬課程)


以下正式開始文章


這節課要講的是continue和break,這兩個都可以用在迴圈(while, do-while, for, foreach)裡。

 

break之前在switch-case有出現過,continue在PHP雖然也有支援switch-case,但一般不太會建議在switch-case使用(之後會提到)。

那我們從來看break和continue在迴圈的使用方式?

 

 

break的用法

首先先來看while迴圈搭配if 條件判斷時的情形。

在下面這個範例是大於10就會跳出,但break並不是從if的大括號跳出去,

而是從目前的迴圈中斷。

 

<?php

$index = 1;

while( $index ){
  echo $index;
  $index ++;
  if($index>10){
    break;
  }
}

echo "end!!";

?>    


輸出結果:

12345678910end!!    


現在有一個陣列$student_list,如果我想利用while迴圈將班級學生名單印出來,可以這樣寫:
 

<?php
 
$index = 0;
$student_list = [
  ["name" => "小明", "score" => "65" ],
  ["name" => "小美", "score" => "65" ],
  ["name" => "老王", "score" => "59" ],
  ["name" => "大華", "score" => "80" ],
];

while ( $index < count($student_list) ) {
  echo $student_list[$index]["name"] . "<br/>";
  $index++;
}

echo "end!!";

?>    


輸出結果:

小明
小美
老王
大華
end!!    

 


假設及格分數是60分,我想要知道「這個班是不是全班都及格」,程式碼會從頭開始比對,如果有一個人不及格(小於60分),程式就會跳出。

因此程式有可能不會掃完全部,除非全班都及格。

像這種中間只要有一項不符合的情形就結束的話,就很適合用break。

我們可以這樣思考,如果有一個人不及格印出「不及格」,如果沒有,則印出「全班都及格」。


 

<?php

$index = 0;

$student_list = [
  ["name" => "小明", "score" => "65" ],
  ["name" => "小美", "score" => "65" ],
  ["name" => "老王", "score" => "59" ],
  ["name" => "大華", "score" => "80" ],
];

while( $index < count($student_list) ){
  $score = intval( $student_list[$index]["score"]);
  if (score < 60){
    echo "有人沒及格!!";
    break;
  }
  $index++;
}

echo "end!!";
?>    

 


輸出結果:

有人沒及格!!!end!!    

 


如果把老王的分數改成60分
 

 

<?php

$index=0;

$student_list = [
  ["name" => "小明", "score" => "65" ],
  ["name" => "小美", "score" => "65" ],
  ["name" => "老王", "score" => "60" ],
  ["name" => "大華", "score" => "80" ],
];

while($index < count( $student_list )){

  $score = intval($student_list[$index]["score"]);

  if (score<60){
    echo "有人沒及格!!";
    break;
  }

  $index++;
}

echo "end!!";

?>    


輸出結果:

end!!    

 


就甚麼都沒出現。

那要如何才能印出全班都及格呢?我們沒辦法直接在if裡面去改,必須要新增一個變數$passFlag = true,只要有人小於60分,就會變成$passFlag = false,整個結束後再利用if else做列印的動作。

 

 

<?php
  $index=0;
  $student_list = [
    ["name" => "小明", "score" => "65" ],
    ["name" => "小美", "score" => "65" ],
    ["name" => "老王", "score" => "60" ],
    ["name" => "大華", "score" => "80" ],
  ];

  $passFlag=true;
  while($index <count($student_list)){
   
    $score = intval($student_list[$index]["score"]);
   
    if (score<60){
      $passFlag =false;
      break;
    }
    $index++;
}

if ( $passFlag ) {
    echo "全班都及格!!!";
} else {
    echo "有人沒及格!!!";
}


echo "end!!";

?>    


輸出結果:

全班都及格end!!    


如果將小美改成40分,

<?php

  $index = 0;

  $student_list = [
    ["name" => "小明", "score" => "65" ],
    ["name" => "小美", "score" => "40" ],
    ["name" => "老王", "score" => "60" ],
    ["name" => "大華", "score" => "80" ],
  ];
 
  $passFlag=true;

  while($index <count($student_list)){
    $score = intval($student_list[$index]["score"]);
    if (score < 60) {
      $passFlag =false;
      break;
    }
  $index++;
}

if ( $passFlag ) {
  echo "全班都及格!!!";
} else {
  echo "有人沒及格!!!";
}

echo "end!!";

?>    

 


輸出結果:

有人沒及格end!!    

 


也可以利用echo $student_list[$index]["name"] . " 沒及格." 印出沒及格的學生名字

 

<?php

  $index=0;

  $student_list = [
    ["name" => "小明", "score" => "65" ],
    ["name" => "小美", "score" => "40" ],
    ["name" => "老王", "score" => "60" ],
    ["name" => "大華", "score" => "80" ],
  ];
 
  $passFlag=true;
  while($index < count($student_list)){
    $score = intval($student_list[$index]["score"]);
    if (score < 60){
      echo $student_list[$index]["name"] . " 沒及格.";
      $passFlag =false;
      break;
    }
    $index++;
}

if( $passFlag ){
  echo "全班都及格!!!";
}else{
  echo "有人沒及格!!!";
}

echo "end!!";
?>    


輸出結果:

小美 沒及格.有人沒及格!!!end!!    


我們也可以用for迴圈來寫,

<?php

  $student_list = [
    ["name" => "小明", "score" => "65" ],
    ["name" => "小美", "score" => "65" ],
    ["name" => "老王", "score" => "59" ],
    ["name" => "大華", "score" => "80" ],
  ];
  $passFlag=true;
 
  for($index=0; $index < count($student_list); $index++){
    $score = intval($student_list[$index]["score"]);
    if (score<60){
      echo $student_list[$index]["name"]." 沒及格.";
      $passFlag = false;
      break;
    }
  }

  if( $passFlag ){
    echo "全班都及格!!!";
  }else{
    echo "有人沒及格!!!";
  }
  
  echo "end!!";
?>    


輸出結果:

老王 沒及格.有人沒及格!!!end!!    

 

 


continue的用法

break是當條件不符合時會跳出目前的迴圈,continue是會跳到過這次的迴圈,繼續從下一次的迴圈開始執行。


我們可以利用上面的範例印出及格名單

 

<?php

  $student_list = [
    ["name" => "小明", "score" => "65" ],
    ["name" => "小美", "score" => "65" ],
    ["name" => "老王", "score" => "59" ],
    ["name" => "大華", "score" => "80" ],
  ];

  echo "<h2>及格名單</h2>";
 
  for($index=0;$index <count($student_list); $index++){
    $score = intval($student_list[$index]["score"]);

    if ( $score < 60 ){
      continue;
    }else{
      echo $student_list[$index]["name"] . "<br/>";
    }
  }
  echo "end!!";
?>    


輸出結果:

 

 

老王並沒有及格,所以if ($score<60)的時候會進入continue(跳過這次的迴圈,並繼續從下一次的迴圈開始執行),也可以把else與括弧拿掉,讓程式碼更簡潔。

因此continue很少出現在if else,通常是遇到if條件成立以後,就會直接跳到下一個迴圈。

<?php

  $student_list = [
    ["name" => "小明", "score" => "65" ],
    ["name" => "小美", "score" => "65" ],
    ["name" => "老王", "score" => "59" ],
    ["name" => "大華", "score" => "80" ],
  ];

  echo "<h2>及格名單</h2>";

  for( $index = 0; $index < count($student_list); $index++){
    $score = intval($student_list[$index]["score"]);
    if ($score<60){
      continue;
    }
    echo $student_list[$index]["name"] . "<br/>";
  }

  echo "end!!";
?>    


輸出結果:

 

 

continue的寫法其實等同於下面的寫法,

<?php

  $student_list = [
    ["name" => "小明", "score" => "65" ],
    ["name" => "小美", "score" => "65" ],
    ["name" => "老王", "score" => "59" ],
    ["name" => "大華", "score" => "80" ],
  ];

  echo "<h2>及格名單</h2>";

  for($index=0;$index < count($student_list); $index++){

    $score = intval($student_list[$index]["score"]);
    if ($score >= 60){
      echo $student_list[$index]["name"] . "<br/>";
    }
  }
  

  echo "end!!";
?>    

 


雖然用if ($score>=60)…去替代if ($score<60)執行continue的方式在這個範例是沒有問題的,但若是有更多條件判斷時,例如小於60或大於100要印出提示字樣,用continue還可以直接執行其他指令

 

 

<?php

if ( $score < 60 ){
 echo "分數太低";
 continue;
}

if ( $score > 100 ){
  echo "分數不正常";
  continue;
}

?>    

 

但if ($score>=60&&score<=100)還要加上更多條件判斷才能完整的印出,

這樣就會比較麻煩一點。

 

 

<?php
if ($score >= 60 && score <= 100){
 echo……
else {
 if…..
…..
}


if ( $score > 100 ){
 echo "分數不正常";
 continue;
}

?>    

 

 

switch case中的continue

在一開始有說PHP雖然也有支援switch case,http://php.net/manual/zh/control-structures.continue.php

 

 

 

但其實不建議在switch case使用。

因為continue在switch裡面會被當成break的功用。

例如在switch case使用break的時候,

 

<?php

switch(1){
  case 1:
    echo "Hi <br/>";
    break;
  case 2:
    echo "hello <br/>";
    break;
}

?>    

 

輸出結果:

Hi 

 

 

程式碼在執行完echo "Hi <br/>"; 以後就會跳出switch case。

如果改成continue的話

 

 

<?php

switch(1){
  case 1:
    echo "Hi <br/>";
    continue;
  case 2:
    echo "hello<br/>";
    continue;
}

?>    

 

輸出結果:

Hi    

 

結果是一樣的。

讓我們在看另一個例子,

<?php

$i =1;
switch($i){
  case 1:
  echo "Hi <br/>";
  $i = 2;
  continue;


  case 2:
    echo "hello<br/>";
    continue;
}

?>    

 

如果設一個變數$i = 1,並在switch case中設個$i = 2,如果按照先前的continue概念,印出Hi以後應該要回到switch重新執行,讓條件變成$i = 2,印出hello,所以下面的程式應該要印出Hi與Hello,但實際輸出結果如下:

 

Hi    

 


只有印出Hi,代表continue被當成break的功用了。

所以不建議在switch-case使用continue,避免混淆直接使用break就可以了。

 

 


最後,如果你喜歡我們的文章,別忘了到我們的FB粉絲團按讚喔!!

Small logo

進度條編輯群

進度條編輯團隊