// @author: huangfeng love 吳佳旻 // 例子1 $arr1 = array('a', 'b', 'c'); foreach ($arr1 as $k => $v) { echo $k . '-' . $v; } $v = 'd'; echo $k; // 2 echo $v; // d var_dump($arr1); /* array 0 => string 'a' (length=1) 1 => string 'b' (length=1) 2 => string 'c' (length=1) */ // 例子2 $arr2 = array('a', 'b', 'c'); foreach ($arr2 as $k => &$v) { echo $k . '-' . $v; } $v = 'd'; echo $k; // 2 echo $v; // d var_dump($arr2); /* array 0 => string 'a' (length=1) 1 => string 'b' (length=1) 2 => &string 'd' (length=1) */ // 例子3 $myfunc = function(){ $arr3 = array('a', 'b', 'c'); foreach ($arr3 as $k => $v) { echo $k . '-' . $v; } $v = 'd'; }; var_dump($k); // null var_dump($v); // null var_dump($arr3); // null // 例子4 $arr4 = array('1'=>'a', '2'=>'b', '3'=>'c'); $arr5 = array('4'=>'x', '5'=>'y', '6'=>'z'); foreach($arr4 as $k => $v) { echo $k . '-' . $v; // 1-a(第一次) 2-b(第二次) 3-c(第三次) // 4-x5-y6-z (三次都同樣) foreach ($arr5 as $k => $v) { echo $k . '-' . $v; } echo $k . '-' . $v; // 6-z(第一次) 6-z(第二次) 6-z(第三次) }
PHP的做用域只有2種:
一、全局 可在任何位置經過$GLOBALS訪問
二、函數/方法/Closure php
結論:
- 只有在當前做用域下定義的元素才能在當前及之內的做用域中訪問到,在其之外的做用域是訪問不到的(結果是null);
- foreach並無建立一個做用域(即它裏面不算一個做用域),因此在foreach迭代的外面訪問鍵值變量,可以獲得其最後一次迭代的值;
- foreach臨時建立的兩個變量($k 和 $v),在以後被從新賦值時,並不會對原數組形成影響,因此能夠放心地在同一個做用域下的多個foreach語句中對不一樣數組使用一樣的$k和$v名稱,而不用刻意改變成$k1, $v1;$k2, $v2
- 若是真的要讓原數組的$k和$v值被從新賦值後對原數組也一樣作出修改,那麼就使用引用傳值(&)
- 對於嵌套foreach,建議取不同的鍵值名稱,如$k1, $v1;$k2, $v2,以免賦值污染 數組