php未设置数组foreach循环创建一个对象

时间:2015-03-29 11:20:39

标签: php arrays json object

我有一个看起来像这样的大JSON:

{
    "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()

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数组更改为对象(或关联数组),如下所示:

{
    "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导致了这一点。

2 个答案:

答案 0 :(得分:2)

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

$itemDB['offHand'] = array_values($itemDB['offHand']);

答案 1 :(得分:0)

我认为,通过取消设置,您正在删除数组的一部分,使其不连续因此可能会转换为对象

我猜上面的一行有点不清楚,所以请考虑这个例子,

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。在第1行,我们声明一个顺序数组并打印它,因为它是顺序它打印成一个数组。在第2行,我们打破了序列。所以再次打印它,虽然它是一个数组,(*它可能是PHP的函数不知道如何转换它)它打印为Object