PHP下foreach的作用域,对数组的操作影响

// @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,以避免赋值污染

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值