PHP坑之:foreach &

代码如下:

$a = array('a','b','c','d');
foreach ($a as &$item){};
print_r($a);
foreach ($a as $item){};
print_r($a);

输出结果:

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
)
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => c
)

问题:两次foreach什么也没做,其中一个使用了&,结果导致数组内容被改变,是为什么呢?

打印详情输出一下:

$a = array('a','b','c','d');
foreach ($a as &$item){};
print_r($a);

foreach ($a as $key => $item) {
	echo "{$key} => {$item} ";
	print_r($a);
}

输出:

Array(    [0] => a    [1] => b    [2] => c    [3] => d)
0 => a Array(    [0] => a    [1] => b    [2] => c    [3] => a)
1 => b Array(    [0] => a    [1] => b    [2] => c    [3] => b)
2 => c Array(    [0] => a    [1] => b    [2] => c    [3] => c)
3 => c Array(    [0] => a    [1] => b    [2] => c    [3] => c)


原因及修正:

$a = array('a','b','c','d');
foreach ($a as &$item){};//此时$item指向$a[3],即'd'
print_r($a);

//php官网给出的正确做法是
//unset($item);

//foreach 下标从0到3,每次循环时取下标赋值给$key,取value赋值给$item,而$item经过上面的循环指向$a[3]
foreach ($a as $key => $item) {//每次都修改$item的值(也就是$a[3]的值)为当前下标所指的值:a,b,c;直到最后第n个和第n-1个值相等
	echo "{$key} => {$item} ";
	print_r($a);
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值