【PHP】20. 迴圈的中斷(continue & break)
【PHP】20. 迴圈的中斷(continue & break)
此文章也有影片介紹,可以搭配影片一起學習!
01. 迴圈的中斷(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的大括號跳出去,
而是從目前的迴圈中斷。
$index = 1;
while( $index ){
echo $index;
$index ++;
if($index>10){
break;
}
}
echo "end!!";
?>
輸出結果:
現在有一個陣列$student_list,如果我想利用while迴圈將班級學生名單印出來,可以這樣寫:
$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。
我們可以這樣思考,如果有一個人不及格印出「不及格」,如果沒有,則印出「全班都及格」。
$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!!";
?>
輸出結果:
如果把老王的分數改成60分
$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!!";
?>
輸出結果:
就甚麼都沒出現。
那要如何才能印出全班都及格呢?我們沒辦法直接在if裡面去改,必須要新增一個變數$passFlag = true,只要有人小於60分,就會變成$passFlag = false,整個結束後再利用if else做列印的動作。
$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!!";
?>
輸出結果:
如果將小美改成40分,
$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!!";
?>
輸出結果:
也可以利用echo $student_list[$index]["name"] . " 沒及格." 印出沒及格的學生名字
$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!!";
?>
輸出結果:
我們也可以用for迴圈來寫,
$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!!";
?>
輸出結果:
continue的用法
break是當條件不符合時會跳出目前的迴圈,continue是會跳到過這次的迴圈,繼續從下一次的迴圈開始執行。
我們可以利用上面的範例印出及格名單
$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條件成立以後,就會直接跳到下一個迴圈。
$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的寫法其實等同於下面的寫法,
$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還可以直接執行其他指令
if ( $score < 60 ){
echo "分數太低";
continue;
}
if ( $score > 100 ){
echo "分數不正常";
continue;
}
?>
但if ($score>=60&&score<=100)還要加上更多條件判斷才能完整的印出,
這樣就會比較麻煩一點。
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的時候,
switch(1){
case 1:
echo "Hi <br/>";
break;
case 2:
echo "hello <br/>";
break;
}
?>
輸出結果:
程式碼在執行完echo "Hi <br/>"; 以後就會跳出switch case。
如果改成continue的話
switch(1){
case 1:
echo "Hi <br/>";
continue;
case 2:
echo "hello<br/>";
continue;
}
?>
輸出結果:
結果是一樣的。
讓我們在看另一個例子,
$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,代表continue被當成break的功用了。
所以不建議在switch-case使用continue,避免混淆直接使用break就可以了。
最後,如果你喜歡我們的文章,別忘了到我們的FB粉絲團按讚喔!!