2024 PHP Conference Japan (日本 PHP 研討會)

for

(PHP 4, PHP 5, PHP 7, PHP 8)

for 迴圈是 PHP 中最複雜的迴圈。它們的行為類似於 C 語言中的對應迴圈。 for 迴圈的語法如下:

for (expr1; expr2; expr3)
    statement

第一個運算式 (expr1) 會在迴圈開始時無條件地執行一次。

在每次迭代開始時,會執行 expr2。如果它的執行結果為 true,迴圈會繼續,並執行巢狀的陳述式。如果它的執行結果為 false,迴圈的執行就會結束。

在每次迭代結束時,會執行 expr3

每個表達式都可以是空的,或包含多個以逗號分隔的表達式。在 expr2 中,所有以逗號分隔的表達式都會被執行,但結果取自最後一部分。 expr2 為空表示迴圈應無限期地運行(PHP 隱式地將其視為 true,就像 C 語言一樣)。這可能不像您想像的那麼無用,因為您通常會希望使用條件式 break 陳述式來結束迴圈,而不是使用 for 的真值表達式。

請參考以下範例。它們都會顯示數字 1 到 10。

<?php
/* 範例 1 */

for ($i = 1; $i <= 10; $i++) {
echo
$i;
}

/* 範例 2 */

for ($i = 1; ; $i++) {
if (
$i > 10) {
break;
}
echo
$i;
}

/* 範例 3 */

$i = 1;
for (; ; ) {
if (
$i > 10) {
break;
}
echo
$i;
$i++;
}

/* 範例 4 */

for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>

當然,第一個範例(或者可能是第四個)看起來最好,但您可能會發現在 for 迴圈中使用空表達式在許多情況下會很方便。

PHP 也支援 for 迴圈的替代「冒號語法」。

for (expr1; expr2; expr3):
    statement
    ...
endfor;

對許多使用者來說,迭代陣列是很常見的事情,如下例所示。

<?php
/*
* 這是個包含一些我們想要在 for 迴圈中修改的資料的陣列。
*/
$people = array(
array(
'name' => 'Kalle', 'salt' => 856412),
array(
'name' => 'Pierre', 'salt' => 215863)
);

for(
$i = 0; $i < count($people); ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>

上述程式碼執行速度可能較慢,因為每次迭代都會擷取陣列大小。由於大小永遠不會改變,因此可以使用一個中間變數來儲存大小,而不是重複呼叫 count() 函式,這樣可以輕鬆最佳化迴圈。

<?php
$people
= array(
array(
'name' => 'Kalle', 'salt' => 856412),
array(
'name' => 'Pierre', 'salt' => 215863)
);

for(
$i = 0, $size = count($people); $i < $size; ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>

新增筆記

使用者貢獻的筆記 2 則筆記

matthiaz
12 年前
可以用迴圈迭代字母。我很驚訝很少人知道這一點。

for($col = 'R'; $col != 'AD'; $col++) {
echo $col.' ';
}

會回傳:R S T U V W X Y Z AA AB AC

請注意,您不能使用 $col < 'AD'。它只適用於 !=
在處理 Excel 欄位時非常方便。
nzamani at cyberworldz dot de
23 年前
關於迴圈速度的重點是,中間和最後一個表達式會在每次迴圈時執行。
因此,您應該嘗試將所有不變的內容移出迴圈。
您通常會使用一個函式來檢查迴圈的最大次數。像這樣

<?php
for ($i = 0; $i <= somewhat_calcMax(); $i++) {
somewhat_doSomethingWith($i);
}
?>

更快的方法是

<?php
$maxI
= somewhat_calcMax();
for (
$i = 0; $i <= $maxI; $i++) {
somewhat_doSomethingWith($i);
}
?>

還有一個小技巧

<?php
$maxI
= somewhat_calcMax();
for (
$i = 0; $i <= $maxI; somewhat_doSomethingWith($i++)) ;
?>

在複製給函式後,$i 的值會改變(後置遞增)。
To Top