关于&符号

        $data = [1, 2, 3];
        foreach ($data as &$value) {
            $value = $value * 2;
        }
        dump($data);
        dump('---------------------');
        foreach ($data as $value) {
            dump($value);
        }

关于&符号

为什么第二个foreach 会输出244 ,而不是246.

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 5

原因就如1楼所解释,解决方法是引用使用完要unset掉:

 $data = [1, 2, 3];
 foreach ($data as &$value) {
    $value = $value * 2;
 }
unset($value)
5年前 评论
_杭城浪子 5年前

原因就如 1 楼所解释,下面是我按自己的理解组织的语言说明:
第一次 foreach 结束之后 $value 的地址指向了 $data 的最后一个元素的地址,也就是 $data[2] ,所以第二次执行 foreach 时相当于在给 $data[2] 重新赋值。

$data = [1, 2, 3];
foreach ($data as &$value) {
    $value = $value * 2;
}
dump($data);
dump('---------------------');
// 此时 $value 的地址指向 $data[2],打印 $data 的结果是 [0 => 2, 1 => 4, 2 => 6]
foreach ($data as $value) {
    // 这里的循环会依次将 $data 的元素赋值给 $value
    // 刚才提到当前 $value 的地址指向 $data[2],也就是循环时会将 $data[2] 进行重新赋值
    dump($data); // 这里可以将 $data 打印出来看,依次会是
    //  [0 => 2, 1 => 4, 2 => 2]  [0 => 2, 1 => 4, 2 => 4]  [0 => 2, 1 => 4, 2 => 4]
    dump($value);
}

file

5年前 评论

$data = [1, 2, 3];
foreach ($data as &$value) {
$value = $value * 2;
}
unset($value);
dump($data);
dump('---------------------');
foreach ($data as $value) {
dump($value);
}
需要unset一下;
如果不unset,&是引用,和指针类似,php底层
第三次循环你的指针没有释放,还指向2,所以还是244;unset就是246了

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!