跪求大佬解惑

<?php

$data = [['name'=>'John','age'=>25],['name'=>'Mary','age'=>30],['name'=>'Peter','age'=>20]];

foreach ($data as &$value) {
    echo "Name: ".$value['name']." Age: ".$value['age'];
}

foreach ($data as $value) {
    echo "Name: ".$value['name']." Age: ".$value['age']."\n\r";

}

有没有大佬帮忙解惑
输出结果为

浏览器:
Name: John Age: 25Name: Mary Age: 30Name: Peter Age: 20
Name: John Age: 25 Name: Mary Age: 30 Name: Mary Age: 30

循序并没有改变任何数值,为什么第二个的循环输出结果变了

大美丽
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案
        $a = [1,2,3];
        foreach ($a as &$item){
            echo $item;echo "<br/>";
        }
        //使用unset($item), 能解决引用问题
        var_dump($a);
        echo "<br/>";
        foreach ($a as $item){
            var_dump($a);//看这里,你就能懂
            echo $item;echo "<br/>";
        }
        var_dump($a);
1个月前 评论
讨论数量: 8

&$value 改变了值

1个月前 评论
美丽 (楼主) 1个月前
美丽 (楼主) 1个月前
        $a = [1,2,3];
        foreach ($a as &$item){
            echo $item;echo "<br/>";
        }
        //使用unset($item), 能解决引用问题
        var_dump($a);
        echo "<br/>";
        foreach ($a as $item){
            var_dump($a);//看这里,你就能懂
            echo $item;echo "<br/>";
        }
        var_dump($a);
1个月前 评论

老生常谈的问题了,在 php 中, foreach 的 $value 并没有作用域,它是全局的。

博客:使用 foreach 使用引用变量需要注意的问题

1个月前 评论

file
第一个 foreach 实际是往 $value 中放地址值,最后 $value 中的地址值指向 $data 的 第3个 item:

Laravel

file
第二个 foreach 中对 $value 的赋值,实际是顺着地址值去修改上图箭头指向的 item3
第1次遍历:$data:

$data = [['name'=>'John','age'=>25],['name'=>'Mary','age'=>30],['name'=>'John','age'=>25];

第2次遍历:$data :

$data = [['name'=>'John','age'=>25],['name'=>'Mary','age'=>30],['name'=>'Mary','age'=>30];

因此第3次遍历时,$data 的 item3 已经是 ['name'=>'Mary','age'=>30]
重点:foreach as &value 是往 $value 中放地址值,对 $value 的赋值是顺着 $value 中保存的地址值去修改 $data

1个月前 评论

foreach &引用后需要unset掉

<?php

$data = [['name'=>'John','age'=>25],['name'=>'Mary','age'=>30],['name'=>'Peter','age'=>20]];

foreach ($data as &$value) {
    echo "Name: ".$value['name']." Age: ".$value['age'];
}
unset($value);

foreach ($data as $value) {
    echo "Name: ".$value['name']." Age: ".$value['age']."\n\r";

}
1个月前 评论

主要还是你使用了& 符号,这个一般用于外部参数须要内部重新赋值后同步值用的,没有这种需求不要随便用&

1个月前 评论

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