// @author: huangfeng love 吴佳旻// 例子1$arr1 = array('a', 'b', 'c');foreach ($arr1 as $k => $v) { echo $k . '-' . $v;}$v = 'd';echo $k; // 2echo $v; // dvar_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; // 2echo $v; // dvar_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); // nullvar_dump($v); // nullvar_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种:
1、全局 可在任何位置通过$GLOBALS访问 2、函数/方法/Closure结论:
- 只有在当前作用域下定义的元素才能在当前及以内的作用域中访问到,在其以外的作用域是访问不到的(结果是null); - foreach并没有创建一个作用域(即它里面不算一个作用域),所以在foreach迭代的外面访问键值变量,能够得到其最后一次迭代的值; - foreach临时创建的两个变量($k 和 $v),在之后被重新赋值时,并不会对原数组造成影响,所以可以放心地在同一个作用域下的多个foreach语句中对不同数组使用同样的$k和$v名称,而不用刻意改变成$k1, $v1;$k2, $v2 - 如果真的要让原数组的$k和$v值被重新赋值后对原数组也同样做出修改,那么就使用引用传值(&) - 对于嵌套foreach,建议取不一样的键值名称,如$k1, $v1;$k2, $v2,以避免赋值污染