foreach

PHP 4 引入了 foreach 結構,和 Perl 以及其他語系很像。這只是一種遍歷陣列簡便方法。foreach 僅能用於陣列,當試圖將其用於其它資料類型或是一個未起始化的變量時會產生錯誤。有兩種語法,第二種比較次要但卻是第一種的有用的增加。

foreach (array_expression as $value)
    statement
foreach (array_expression as $key => $value)
    statement

第一種格式遍歷給定的 array_expression 陣列。每次迴圈中,現用的單元的值被賦給 $value 並且陣列內定的指標向前移一步(因此下一次迴圈中將會得到下一個單元)。

第二種格式做同樣的事,只除了現用的單元的鍵名也會在每次迴圈中被賦給變量 $key

自PHP 5 起,還可能遍歷物件

注: foreach 開始執行時,陣列內定的指標會自動指向第一個單元。這意味著不需要在 foreach 迴圈之前呼叫 reset()

注: 除非陣列是被引用foreach 所動作的是指定陣列的一個複製,而不是該陣列本身。因此陣列指標不會被 each() 結構改變,對返回的陣列單元的修改也不會影響原陣列。不過原陣列的內定指標的確在處理陣列的過程中向前搬移了。假定 foreach 迴圈運行到結束,原陣列的內定指標將指向陣列的結尾。

自 PHP 5 起,可以很容易地通過在 $value 之前加上 & 來修改陣列的單元。此方法將以引用賦值而不是複製一個值。

<?php
$arr 
= array(1234);
foreach (
$arr as &$value) {
    
$value $value 2;
}
// $arr is now array(2, 4, 6, 8)
?>

此方法僅在被遍歷的陣列可以被引用時才可用(例如是個變量)。

注: foreach 不支援用「@」來抑制錯誤訊息的能力。

會員可能注意到了以下的代碼功能完全相同:

<?php
$arr 
= array("one""two""three");
reset($arr);
while (list(, 
$value) = each($arr)) {
    echo 
"Value: $value<br>\n";
}

foreach (
$arr as $value) {
    echo 
"Value: $value<br />\n";
}
?>

以下代碼功能也完全相同:

<?php
$arr 
= array("one""two""three");
reset($arr);
while (list(
$key$value) = each($arr)) {
    echo 
"Key: $key; Value: $value<br />\n";
}

foreach (
$arr as $key => $value) {
    echo 
"Key: $key; Value: $value<br />\n";
}
?>

示範用法的更多例子:

<?php
/* foreach example 1: value only */

$a = array(12317);

foreach (
$a as $v) {
   echo 
"Current value of \$a: $v.\n";
}

/* foreach example 2: value (with key printed for illustration) */

$a = array(12317);

$i 0/* for illustrative purposes only */

foreach ($a as $v) {
    echo 
"\$a[$i] => $v.\n";
    
$i++;
}

/* foreach example 3: key and value */

$a = array(
    
"one" => 1,
    
"two" => 2,
    
"three" => 3,
    
"seventeen" => 17
);

foreach (
$a as $k => $v) {
    echo 
"\$a[$k] => $v.\n";
}

/* foreach example 4: multi-dimensional arrays */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";

foreach (
$a as $v1) {
    foreach (
$v1 as $v2) {
        echo 
"$v2\n";
    }
}

/* foreach example 5: dynamic arrays */

foreach (array(12345) as $v) {
    echo 
"$v\n";
}
?>