這篇文章介紹的內容是關於PHP foreach的兩種用法 as $key => $value,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
一 foreach的文法介紹
PHP 4以上的版本包括了 foreach 結構,這隻是一種遍曆數組簡便方法。foreach 僅能用於數組,當試圖將其用於其它資料類型或者一個未初始化的變數時會產生錯誤。有兩種文法,第二種是第一種的有用的擴充。
1 2 |
foreach(array_expression as $value) statementforeach(array_expression as $key => $value) statement
|
第一種格式遍曆給定的 array_expression 數組。每次迴圈中,當前單元的值被賦給 $value 並且數組內部的指標向前移一步(因此下一次迴圈中將會得到下一個單元)。
第二種格式做同樣的事,只是除了當前單元的值以外,索引值也會在每次迴圈中被賦給變數 $key。看下面代碼:
1 2 3 4 5 6 7 8 9 |
$arr = array("1"=>"111","2"=>"222","3"=>"333");foreach($arr as $key=>$value){echo $key."=>".$value."\n";}結果如下:1=>1112=>2223=>333
|
索引值這裡可以理解為數組下標,數組元素a[2]的下標就是2.
當 foreach 開始執行時,數組內部的指標會自動指向第一個單元。這意味著不需要在 foreach 迴圈之前調用 reset()。而while迴圈需要reset。下面兩種代碼功能完全相同。
1.用while迴圈
1 2 3 4 5 |
$arr = array("one", "two", "three");reset ($arr);while (list(, $value) = each ($arr)) {echo "Value: $value<br>\n";}
|
2.用foreach
1 2 3 |
foreach ($arr as $value) {echo "Value: $value<br>\n";}
|
此外注意 foreach 所操作的是指定數組的一個拷貝,而不是該數組本身。因此即使有 each() 的構造,原數組指標也沒有變,數組單元的值也不受影響。
foreach 不支援用“@”來禁止錯誤資訊的能力。
二 PHP foreach 小結
1.foreach 中使用引用的情況。
普通情況下,foreach($arr as $value)中的$arr和$value是拷貝,不受外部影響的,即
1 2 3 4 5 6 7 8 9 |
$arr = array(0,1,2,3,4,5);foreach($arr as $value){$arr = array();echo $value;}
|
結果是:12345
但如果$arr是引用的話,情況則不同了,我們用代碼來說明問題
1 2 3 4 5 6 7 8 9 10 11 |
$arr = array(0,1,2,3,4,5);$arr = &$arr;foreach($arr as $value){$arr = array();echo $value;}
|
結果是: 0
這是因為迴圈用的$arr是直接指向原資料的,而不是copy了一份。
如果$value是引用,而$arr不是引用,其結果是一樣的,同樣$value是指向原資料的而不是copy
1 2 3 4 5 6 7 8 9 |
$arr = array(0,1,2,3,4,5);foreach($arr as &$value){$arr = array();echo $value;}
|
結果是: 0
還有一種情況比較特殊,即是如果定義了$arr為全域變數的話,$arr也會變成引用
1 2 3 4 5 6 7 8 9 10 11 |
global $arr;$arr = array(0,1,2,3,4,5);foreach($arr as $value){$arr = array();echo $value;}
|
結果是: 0
2. 如果兩次迴圈一個數組,一定不能這樣寫
1 2 3 |
foreach($arr as &$value){}foreach($arr as $value){}
|
這會導致第二次的迴圈的結果不正確(可能是php的bug吧)。可以用以下幾種來代替:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//solution 1foreach($arr as &$value){}unset($value);foreach($arr as $value){}//solution 2foreach($arr as &$value){}foreach($arr as &$value){}//solution 3foreach($arr as &$value){}$arr2 = $arr;foreach($arr2 as $value){}
|
相關推薦:
詳解PHP中foreach的用法和執行個體