foreach php key,php中foreach循环中键值使用&的问题

这个var_dump里出现的&代表你可以用一个其他的变量来改变它的值。

比如你这样

$b = &$a[0];

var_dump($a);

这里打印的时候就会在第一个键值里出现&符号,表示你可以用其他变量($b)来更改它的值。

先来了解一下&的基本用法。

$b = $c = 1;

$a = &$b;

$a = 2;

echo "b=$b,c=$c\n";

$a = &$c;

$a = 100;

$a = 200;

echo "b=$b,c=$c\n";

unset($a);

$a = 500;

echo "b=$b,c=$c\n";

上面$a指定成$b的引用之后,除非再次指定成其他引用,或者unset($a),否则改变$a就是改变对应的$b的值。

对于你这个foreach,也是同样的道理,你把循环单步拆开,就是这个样子:

$value = &$a[0];

$value = 5;

$value = &$a[1];

$value = 5;

$value = &$a[2];

$value = 5;

循环运行到最后的时候,$value是$a[2]的引用,所以就相当于这么个形式:

$a[0] = 5;

$a[1] = 5;

$value = &$a[2];

$a[2] = 5;

var_dump($a);

也就不难理解为什么var_dump会在最后的键值对上打印出一个&的符号了吧。

一般情况下这个不会导致什么大问题,只不过由于foreach的作用域问题,会导致在循环退出之后$value依旧可以使用,所以会出现一些匪夷所思的bug。

比如这样

$a = [1, 2, 3];

foreach($a as $key => &$value) {

$value = $value+5;

}

var_dump($a); // [6,7,8]

foreach($a as $value){}

var_dump($a); // [6,7,7]

加了一句空的foreach之后,反而导致$a变的不合理了,这个bug匪夷所思,原因也是因为那个空foreach里的$value是最上面那个&a[2]的引用。

那个空foreach相当于这样:

$value = &$a[2];

$value = $a[0];

$value = $a[1];

$value = $a[2];

注意到了么,由于$value是$a[2]的引用,所以上面的改写一下就是这样:

$a[2] = $a[0];

$a[2] = $a[1];

$a[2] = $a[2];

空foreach里在不停的改变$a[2],而由于$a[2]已经变成$a[1]的值了,所以$a[2] = $a[2];没有任何影响,值还是$a[1];

这种匪夷所思的bug是由于$value这个变量的作用域导致的,所以要么改个名,要么先把$value给unset掉。

$a = [1, 2, 3];

foreach($a as $key => &$value) {

$value = $value+5;

}

var_dump($a);

// 要么unset

unset($value);

// 要么foreach里不要用上面同名的$value,改为$value2222

foreach($a as $value2222){}

var_dump($a);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值