【PHP】18. while 與 do-while迴圈,補充遞增遞減運算子
【PHP】18. while 與 do-while迴圈,補充遞增遞減運算子
此文章也有影片介紹,可以搭配影片一起學習!
01. 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迴圈若在條件永遠成立的情況會變成無窮迴圈。
$flag = true;
while ( $flag ){
echo "Hi";
}
?>
輸出結果:
Hi
Hi
…
...
(無窮迴圈,直到系統資源被吃光,以前會當機,現在的系統比較不容易搞掛)
結論:while迴圈是適用於有限度條件判斷的,如果你的條件永遠成立的情況,while迴圈會變成無窮迴圈而讓系統有機會跑到當機~
那甚麼時候可以使用呢?
如果我們只希望它執行一次,我們可以在印出Hi以後加上 $flag = false; ,當它執行到 $flag = false; 後就會跳出迴圈。
$flag = true;
while( $flag ){
echo "Hi";
$flag = false;
}
?>
輸出結果:
結論:當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數字。
我們可以這樣寫:
$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
$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 就可以避開這個小陷阱,
$count=4;
while( $count > 0 ){
echo "<h1>Hi<h1>";
echo "count:" . $count . "<br/>";
$count -= 3;
}
?>
輸出結果:
因此我們可以發現while迴圈很容易變成無窮迴圈掛掉,所以不建議寫太複雜的東西。(但是現實都只有很複雜的運用,但我們有很多方式可以簡化它,至少視覺上簡化)。
不過一般來說我們會使用 -=1 的機率大於其他的數字,因為while迴圈基本上都會跟陣列搭配,While迴圈的目的就是把把所有的值通通都列出來,如果用的是 -=2 -=3之類的話,有些值會被跳掉,一切還是看實際情況怎麼做。
不過-=1&+=1被使用的機率實在太高了,所以又出現了一個語法糖叫做 -- or ++,再改寫一下,
$count = 4;
while ( $count > 0 ){
echo "<h1>Hi<h1>";
echo "count:".$count."<br/>";
$count --;
}
?>
輸出結果:
在很多舊型的考試裡面,常常會寫「加加減減連在一起」,其實是非常沒有必要的,極度建議不要這樣寫,否則只會增加未來自己與他人閱讀的困難性。
另外,在if else的語法裡有一個特性,如果條件裡的值是0的話,就會直接跳掉(甚麼都不顯示),這個情形和while迴圈是一樣的。
而用這個邏輯我們可以把 $count-- 直接放在條件裡,這樣就可以更簡化。
當while條件是0的時候,程式就跳出。
$count=4;
while($coun--){
echo "<h1>Hi<h1>";
echo "count:".$count."<br/>";
}
?>
輸出結果:
你可能會想說,為什麼出現的是「3—2—1—0」呢?原因是因為while迴圈會先執行在條件裡 $coun--(4變成3) ,然後遞減的值(3)再放到echo,以此類推,echo出來的值是「3—2—1—0」。
如果你不希望印出0的話,可以把$coun—改成-- $count,echo出來的值就會是「3—2—1」(條件是0的時候,程式就跳出)。
$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迴圈把它印出來的時候,我們可以這樣寫,
$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++,進行遞增。
$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放後面。
$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粉絲團按讚喔!!