关于&符号

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

关于&符号

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5

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

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

原因就如 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

4年前 评论

$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了

4年前 评论

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