首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组foreach循环中的php unset创建一个对象。

数组foreach循环中的php unset创建一个对象。
EN

Stack Overflow用户
提问于 2015-03-29 11:20:39
回答 2查看 1.1K关注 0票数 1

我有一个很大的JSON,看起来如下所示:

代码语言:javascript
复制
{
    "bracers": [
        {
            "id": "Bracers_208",
            "name": "Unearthed Boon"
        }
    ],
    "offHand": [
        {
            "id": "Bracers_208",
            "name": "Unearthed Boon"
        },
        {
            "id": "Weapon123",
            "name": "Some Weapon Boon"
        },
        {
            "id": "Weapon456",
            "name": "Some Other Weapon Boon"
        }
    ],
    "mainHand": [
        {
            "id": "Weapon123",
            "name": "Some Weapon Boon"
        }
    ]
}

我像这样解码JSON:

$itemDB = json_decode($json, true);

我现在要做的是从offHand中删除已经在mainHand中的所有条目。所以我循环两次,如果有匹配的话,比较idunset()的值。

代码语言:javascript
复制
foreach($itemDB['offHand'] as $index => $item) {

    foreach($itemDB['mainHand'] as $key => $weapon) {

        if($item['id'] == $weapon['id']) {

            unset($itemDB['offHand'][$index]);

        }

    }

}

然后我再对它进行编码:

$newJSON = json_encode($itemDB, JSON_PRETTY_PRINT);

删除重复项是可行的,但是offHand数组被更改为如下所示的对象(或assoc数组):

代码语言:javascript
复制
{
    "bracers": [
        {
            "id": "Bracers_208",
            "name": "Unearthed Boon"
        }
    ],
    "offHand": [
        "0": {
            "id": "Bracers_208",
            "name": "Unearthed Boon"
        },
        "2": {
            "id": "Weapon456",
            "name": "Some Other Weapon Boon"
        }
    ],
    "mainHand": [
        {
            "id": "Weapon123",
            "name": "Some Weapon Boon"
        }
    ]
}

为什么会发生这种情况,我怎样才能防止这种情况发生?

编辑:为了澄清,如果我移除unset函数,在循环中什么也不做(或者只是向对象添加一个属性),JSON中的附加键就不存在了,JSON数组也没有问题。这就是为什么我得出结论,unset是造成这种情况的原因。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-29 11:33:17

循环结束后,添加以下代码行以从offHand数组元素中移除键:

代码语言:javascript
复制
$itemDB['offHand'] = array_values($itemDB['offHand']);
票数 2
EN

Stack Overflow用户

发布于 2015-03-29 11:52:33

在某种程度上,我认为,通过unset,您正在移除数组的一部分,使其不连续,因此它可能被转换为对象。

我想上面的台词有点不清楚,所以考虑一下这个例子,

代码语言:javascript
复制
function ep($f)
{
    echo "<br><pre><code>";
    print_r($f);
    echo "</code></pre><br";
}
$t = array("a","b","c");

ep(json_encode($t));

unset($t[1]);

ep(json_encode($t));

忘记函数ep.On第1行,我们声明一个顺序数组并打印它,因为它是顺序的,它打印为一个数组。在第2行,我们打破了序列。因此,再次打印它,尽管它是一个数组,(*它可能PHP的函数不知道如何转换它)它打印为对象

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29328453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档