進度條

【PHP】18. while 與 do-while迴圈,補充遞增遞減運算子

【PHP】18. while 與 do-while迴圈,補充遞增遞減運算子

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

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

01. while 與 do-while迴圈,補充遞增遞減運算子 (所屬課程)

02. while 與 do-while迴圈,補充遞增遞減運算子 (所屬課程)


以下正式開始文章


前幾堂課介紹了陣列的運用以及注意事項,接下來介紹的是迴圈,迴圈顧名思義就是針對特定的條件反覆執行,這樣可以減少許多重複性的程式碼。

 

While迴圈

while的迴圈的定義:

如果條件符合while迴圈的內容就會一直執行,直到遇到不符合條件或break則停止。

這會有兩種情形,一種是執行,直到遇到不符合條件則停止

例如跑出大於0、小於10的整數,系統會輸出1.2.3.4.5.6.7.8.9,遇到9(小於10則停止) 。

另一種是遇到條件永遠成立的情況,while迴圈的內容就會一直執行,直到形成無窮迴圈(系統跑到當機)。

那甚麼時候可以使用while迴圈,甚麼時候該避免使用呢?

例如我們有一個變數叫$flag(旗子),如果旗子舉起來,$flag(旗子)=true,則印出Hi。

一般來說寫法會是下面這樣子,跟if else的概念有點像,如果是true就執行,如果不是true則跳出。

只是if只會執行一次,但while迴圈若在條件永遠成立的情況會變成無窮迴圈。

 

<?php

$flag = true;

while ( $flag ){
   echo "Hi";
}

?>    


輸出結果:

Hi
Hi
Hi

...

(無窮迴圈,直到系統資源被吃光,以前會當機,現在的系統比較不容易搞掛)    


結論:while迴圈是適用於有限度條件判斷的,如果你的條件永遠成立的情況,while迴圈會變成無窮迴圈而讓系統有機會跑到當機~

 

 

那甚麼時候可以使用呢?

如果我們只希望它執行一次,我們可以在印出Hi以後加上 $flag = false; ,當它執行到 $flag = false; 後就會跳出迴圈。

 

<?php

$flag = true;
while( $flag ){

 echo "Hi";
 $flag = false;

}
?>    

 


輸出結果:

 

Hi    


結論:當while迴圈執行,直到遇到不符合條件時則會停止。

 

 

那我要怎麼讓「Hi」印出指定個數又不會當機呢?

例如我想印出2個「Hi」的話要怎麼做呢?

 

思路:

1.設定一個變數$count當計數器,一開始是$count = 2

2.$count將會持續減少2、1,這個程式可以寫成 $count = $count - 1 (遞減的意思)

3.當$count到0時,則執行後跳出。

因此條件可以設成 $count != 0 ,當count=0的時候程式則跳出

4.為了方便確認程式正確性,利用 echo "count:" . $count . "<br/>"印出目前的$count數字。

 

我們可以這樣寫:

<?php

$count=2;

while($count!=0){

  echo "<h1>Hi</h1>";
  echo "count:" . $count . "<br/>";
  $count = count - 1;

}
?>    

 


輸出結果:

 

 

 

 

遞增遞減運算子

 

在程式語言裡,對變數遞增遞減的行為非常常見,因此衍生出了語法糖(用更簡潔的語法,提高寫程式的效率)。

 

$count = $count – 1 等於  $count -= 1  等於  $count --

$count = $count + 1 等於  $count += 1   等於  $count ++

$count = $count * 1 等於  $count *= 1

$count = $count / 1 等於  $count /= 1

 

所以上面的$count = $count – 1 可以改寫成$count -= 1,這兩句話是同義,

 

 

因此,上面的語法改成$count -= 1

 

<?php

$count=2;

while( $count != 0 ){
  echo "<h1>Hi<h1>";
  echo "count:" . $count . "<br/>";
  $count -= 1;
}

?>    


輸出結果:

 

 

 

結果是一樣的。

 

當然遞減不只遞減1,也可以遞減指定的數字 ex: $count -= 3,不過你如果一次減3的話程式碼會變成無窮迴圈,因為$count != 0 是true的話就會一直執行,而這個條件在while迴圈裡是一直符合的。
 

 

我們把條件改成 $count>0 就可以避開這個小陷阱,
 

<?php

$count=4;

while( $count > 0 ){
  echo "<h1>Hi<h1>";
  echo "count:" . $count . "<br/>";
  $count -= 3;
}
?> 


輸出結果:

 

 

因此我們可以發現while迴圈很容易變成無窮迴圈掛掉,所以不建議寫太複雜的東西。(但是現實都只有很複雜的運用,但我們有很多方式可以簡化它,至少視覺上簡化)。
 

 

不過一般來說我們會使用 -=1 的機率大於其他的數字,因為while迴圈基本上都會跟陣列搭配,While迴圈的目的就是把把所有的值通通都列出來,如果用的是 -=2 -=3之類的話,有些值會被跳掉,一切還是看實際情況怎麼做。


 

不過-=1&+=1被使用的機率實在太高了,所以又出現了一個語法糖叫做 --  or  ++,再改寫一下,


 

<?php

$count = 4;

while ( $count > 0 ){
  echo "<h1>Hi<h1>";
  echo "count:".$count."<br/>";
  $count --;
}

?>  

 

 
輸出結果:

 

 

 

在很多舊型的考試裡面,常常會寫「加加減減連在一起」,其實是非常沒有必要的,極度建議不要這樣寫,否則只會增加未來自己與他人閱讀的困難性。

 

另外,在if else的語法裡有一個特性,如果條件裡的值是0的話,就會直接跳掉(甚麼都不顯示),這個情形和while迴圈是一樣的。

 

而用這個邏輯我們可以把 $count-- 直接放在條件裡,這樣就可以更簡化。

當while條件是0的時候,程式就跳出。

 

<?php

$count=4;
while($coun--){
  echo "<h1>Hi<h1>";
  echo "count:".$count."<br/>";
}

?>    

 


輸出結果:

 

 

你可能會想說,為什麼出現的是「3210」呢?原因是因為while迴圈會先執行在條件裡 $coun--(4變成3) ,然後遞減的值(3)再放到echo,以此類推,echo出來的值是「3210」。

如果你不希望印出0的話,可以把$coun—改成-- $count,echo出來的值就會是「3—2—1」(條件是0的時候,程式就跳出)。

 

<?php

$count = 4;

while( --$count ){

  echo "<h1>Hi<h1>";
  echo "count:" .  $count . "<br/>";
}

?>    

 


輸出結果:

 

 

 

 

再複習一下,前面有說

$count = $count – 1 等於  $count -= 1  等於  $count --

$count = $count + 1 等於  $count += 1   等於  $count ++

$count = $count * 1 等於   $count *= 1

$count = $count / 1 等於   $count /= 1

 

沒有$count** 和 $count//, 因為$count*1無論乘幾次都是原本的值,除法也是無論除以幾次都是原本的值。

(不過 // 會變成註解就是了)

 

 

while迴圈與陣列結合

當我們有一個$array = ["進度調", "線上", "課程"];,想要用while迴圈把它印出來的時候,我們可以這樣寫,

 

<?php

$array = ["進度調", "線上", "課程"];

$count=3;

while( $count-- ){

  echo "<h1>Hi<h1>";
  echo $array[$count] . "<br/>";

}

?> 


 

 

這時會發現一個問題,我們的陣列順序是倒過來的,變成 「課程 — 線上 — 進度條」,該怎麼做呢?我們可以這樣改寫。

 

思路:

1. 設定一個變數 $count = count($array),印出$array的個數,備註:count()為系統函數,可以印出陣列的個數

2.設定一個變數$index當作初始值,一開始是 $index = 0

3.利用 echo $array[$index] . "<br/>" 印出目前的$count數字。

4.利用$index++,進行遞增。

 

<?php

$array=[“進度調”,”線上”,”課程”];
$count=count($array);
$index=0;


while( $count-- ){

  echo "<h1>Hi<h1>";
  echo $array[$index] . "<br/>";
  $index++;


}

?> 

 

 

不過這個寫法因為太常用了,因此就又生出了一個語法糖,而這個語法糖在C語言時代就產生了- for迴圈,for迴圈可以把陣列用正序的方式顯示出來,while迴圈比較擅長倒序,這也導致大部分時候while迴圈幾乎看不到,大多都是for迴圈,而那for迴圈之後又衍生成for each,然後現在大家都用for each,關於for迴圈與for each的介紹會在下一堂課說明。

(工程師是一種極度懶惰的生物,所以很多工程師會為了自己的方便設計很多奇怪的寫法,然後因為很懶惰所以其實也不太想跟其他人協調。如果該寫法不小心變成了standard很受歡迎,後來入門的人就只好又多學一種寫法了。)
 

 

do while迴圈

我們拿前面的例子改成do while迴圈,簡單來說就是把do放前面,while放後面。

 

<?php

$array = ["進度調", "線上", "課程"];
$count = count($array);
$index = 0;
 
do{

  echo "<h1>Hi<h1>";
  echo $array [$index] . "<br/>";
  $index++;

while ( $count-- );

?>    

 


輸出結果:

 

 

 

為什麼最後面一個只印出Hi呢?程式碼會先做do的部分,再印出while,因此會先印出 「進度條 — 線上 — 課程」。

$array 裡面只有三個值,但是「Hi 」印出了4個,這代表$index 跑到3了。如果強迫php array 印出超出它所包含的編號。他就會跳掉。所以最後出現4個HI 與 3個文字。

 

 

不過do while迴圈現在比較少看到有人在使用,雖然相對少人用但還是有可能會碰到,大家可以先記得有這件事就好。

 

 

而for迴圈、for each迴圈、while迴圈 、do while迴圈,這四種迴圈彼此之間若做一些細微的調整其實是可以互相取代的,以老師個人來說,現在最常用的是foreach迴圈 > for迴圈 > while迴圈 > do while迴圈。

 

 


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

Small logo

進度條編輯群

進度條編輯團隊