在程式設計時,有些情況是不預設重複的次數,而是依據當時的情形來決定迴圈指令是否持續進行,此種重複的方式即為條件式迴圈指令,也就是while迴圈。
while
以下是while迴圈指令的標準語法:
while (條件式) {
當條件式成立時要執行的指令區塊;
}
所有的迴圈指令在設計時一定要留意的是,它必需要有可以自行結束的時機。此點在伺服端的程式更是特別地重要,因為如果因為程式設計不當而造成程式指令的無窮迴圈,也就是不間斷地重複執行,此程式會吃掉大量的CPU執行資源,如果你是在共享主機空間上犯下了這個錯誤,你的主機帳戶應該就會馬上收到主機商停權的處分。
由於while迴圈是在條件式成立時才會執行中間的指令區塊,因此要進入迴圈執行的必要條件就是條件式一開始要能夠是成立的狀態。而且,在指令區塊中一定要有至少一個地方會在執行的過程中具備更改條件式中任一變數的能力,使其有機會會在某一個我們設計的情況下讓該條件式變得不成立而離開迴圈。
以下是一個簡單的示範(以下的程式其實利用for指令更容易達成):
<?php
$i = 0;
while ($i<10) {
echo "Hello world!\n";
$i++;
}
?>
此程式一開始讓變數$i的初值為0,所以在進入迴圈之前的檢測$i<10一定會成立,所以就進入了while迴圈的內部程式指令區塊。在while之內,除了顯示出"Hello world\n"這個字串之外,我們還讓$i變數有加1的機會,也就是每執行1次就會讓$i的內容逐漸增加,當$i的內容到達10時,「$i<10」這個條件式就不再被滿足,也就讓while迴圈指令停止執行了。
當然,如同for迴圈一樣,$i變數也是可以拿來用的,請看以下的列出1~100之間所有的奇數的例子:
<?php
$i = 1;
while ($i<99) {
echo "$i, ";
$i+=2;
}
echo "$i\n";
?>
程式的開頭處先設定變數為1,之後只要小於99都會列出變數的內容,而且每次變數都增加2以確保顯示的都是奇數。最後,在離開迴圈之前,還要把最後1個變數(也就是99)顯示出來,因為 $i<99這個條件式在$i是99時並不會成立,所以要在最後面的地方把它列印出來,並加上一個換列符號作為結尾。
break以及continue
有些時候在執行迴圈指令時如果遇到一些情況是要立即讓迴圈指令中斷執行的,那時就可以在必要的時候使用break這個指令。
break這個指令我們在switch指令時有看過,它的特性是,只要執行到它,它就會脫離目前這個區塊而回到它的上一層。對於while來說,在while迴圈裡面遇到break就會直接中斷迴圈的執行。
先來看沒有加上break的例子:
<?php
$i = 0;
while ($i<10) {
$i++;
echo "$i\n";
}
?>
上述的程式會列印出1~10等10個數字。以下是加上break的例子:
<?php
$i = 0;
while ($i<10) {
$i++;
if ($i==7) break;
echo "$i\n";
}
?>
上述的程式中,因為多了一個if ($i==7) break; 的敘述,會讓執行的結果變成以下這個樣子,因為當$i等於7的時候,迴圈就被強制停止了:
1
2
3
4
5
6
和break有一個常常拿在一起比較的例子是continue,它並不是中斷所有的作業,而是中止現有的這一次,讓迴圈從下一次開始,我們把上述的程式更改如下:
<?php
$i = 0;
while ($i<10) {
$i++;
if ($i==7) continue;
echo "$i\n";
}
?>
if的簡化寫法
請留意,當if敘述後面只有一行指令的時候,就不需要加上大括號,同時也可以直接把指令寫在if同一列的後方。
執行結果如下:
1
2
3
4
5
6
8
9
10
同學們是否能夠注意到其中的差異呢?在上述的結果中,7被忽略掉了,但是continue指令並不會影響到8,9,10後面這3個數字喔。
do while
PHP還有一個比較不常用的while迴圈指令就是do while,它的標準語法如下:
do {
條件式成立時要重複執行的指令區塊;
while (條件式);
此指令和while最大的差異在於第一遍一定會被執行,因為一開始並沒有條件式可以檢查,它是執行之後才會再決定是否要再繼續執行下一遍。因此,我們也可以說它是後測迴圈,而之前的while則是前測迴圈。
後測和先測的差別
應該就是第一遍是否有可能會被執行到吧。同學們可以依據自己容易理解的演算流程來決定要使用哪一種迴圈。
do while指令格式的注意事項
在while條件式後面要注意加上分號作為該指令的結尾喔。