PHP foreach使用 & 引用详细过程解读

<?php
$arr = [1,2,3];
foreach ($arr as &$a){
    $a = $a * $a;
    print_r($a);
    print_r("\n");
    print_r($arr);
}

print_r($a);
print_r("\n");

foreach($arr as $a){
    print_r($a);
    print_r("\n");
    print_r($arr);
}

输出结果是

1
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
4
Array
(
    [0] => 1
    [1] => 4
    [2] => 3
)
9
Array
(
    [0] => 1
    [1] => 4
    [2] => 9
)
9
————————————————分界线————————————————————
1
Array
(
    [0] => 1
    [1] => 4
    [2] => 1
)
4
Array
(
    [0] => 1
    [1] => 4
    [2] => 4
)
4
Array
(
    [0] => 1
    [1] => 4
    [2] => 4
)

这个过程很清晰了,在第一次循环后,$a作为引用,最后一次循环时,是直接把$arr元素的最后一个地址赋值给了$a,所以$a是一个引用,且指向最后$arr的最后一个地址,从分界线以前就能发现$a输出的是9。

紧接着第二次循环,大家要记得这是$a仍然是个引用,且指向$arr的最后一个元素9,第二次的foreach中的$a并不像普通的变量一样,重新分配内存,如果是普通变量则会创建值,将$a指向这个新值,但是引用的特点是将新值替换掉原来的值

 这样讲解就清晰明了了。

解决这个问题的方式,则是及时的将引用释放掉unset($a),与下面的$a变量不混淆,只要及时的unset($a),再次出现$a时,php会自动地将$a设置为一个普通变量,并分配它自己的地址和值空间,每次foreach都是提取数据往$a的值中拷贝

从编码性能来看,使用&会造成一些开发思考上的负担,但是这个过程少了拷贝值的过程,如果在密集计算和大数据量下,引用的优势就变得很明显了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值