将对象推送到数组会覆盖以前的值

我继承了一个代码库,在其中我发现了一些精炼和“煮沸”的版本,如下所示


$json = '[ {"id": 1, "val":"apple"}, {"id": 2, "val":"mango"} ]';


$data = json_decode($json);

$arr = [];

foreach($data as $d){

    $m->id  = $d->id;

    $m->val = $d->val;

    $arr[] = $m;

}


print_r($arr);

结果


Array

(

    [0] => stdClass Object

        (

            [id] => 2

            [val] => mango

        )


    [1] => stdClass Object

        (

            [id] => 2

            [val] => mango

        )


)

我的问题是为什么当前的迭代会对它的前任产生任何影响?


PHP 版本:7.2


编辑:如果问题看起来与 json 有关,但事实并非如此,我深表歉意,相反,在我的代码库中,我有这些对象来自另一个称为函数的对象。我使用 json_decode 只是为了说明问题


翻阅古今
浏览 72回答 1
1回答

当年话下

$m没有明确定义。所以当 php 第一次遇到时$m,php 会创建这个变量。当你有->符号时,php 就会理解这是对象。所有其他迭代都只是使用同一个实例$m。此外,启用错误报告后,您会看到警告:警告:从空值创建默认对象而在 php8 中你会得到一个致命错误。解决方案:foreach($data as $d){    // explicitly define $m    $m = new stdClass;    $m->id  = $d->id;    $m->val = $d->val;    $arr[] = $m;}
打开App,查看更多内容
随时随地看视频慕课网APP