PHP的FOREACH作用域笔记

若如初见. 提交于 2020-04-07 05:52:49
// @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种:
1、全局 可在任何位置通过$GLOBALS访问
2、函数/方法/Closure

结论:
- 只有在当前作用域下定义的元素才能在当前及以内的作用域中访问到,在其以外的作用域是访问不到的(结果是null);
- foreach并没有创建一个作用域(即它里面不算一个作用域),所以在foreach迭代的外面访问键值变量,能够得到其最后一次迭代的值;
- foreach临时创建的两个变量($k 和 $v),在之后被重新赋值时,并不会对原数组造成影响,所以可以放心地在同一个作用域下的多个foreach语句中对不同数组使用同样的$k和$v名称,而不用刻意改变成$k1, $v1;$k2, $v2
- 如果真的要让原数组的$k和$v值被重新赋值后对原数组也同样做出修改,那么就使用引用传值(&)
- 对于嵌套foreach,建议取不一样的键值名称,如$k1, $v1;$k2, $v2,以避免赋值污染


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!