为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
翻阅古今 2024-01-19 10:18:33
我继承了一个代码库,在其中我发现了一些精炼和“煮沸”的版本,如下所示$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 只是为了说明问题
查看完整描述

1 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

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

}


查看完整回答
反对 回复 2024-01-19
  • 1 回答
  • 0 关注
  • 71 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信