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

数组foreach循环中的php unset创建一个对象,php,arrays,json,object,Php,Arrays,Json,Object,我有一个大JSON,看起来像这样: { "bracers": [ { "id": "Bracers_208", "name": "Unearthed Boon" } ], "offHand": [ { "id": "Bracers_208", "name": "Unearthed Boon" },

我有一个大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"
        }
    ]
}
{
    "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"
        }
    ]
}
我对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"
        }
    ]
}
{
    "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"
        }
    ]
}
$itemDB=json\u decode($json,true)

我现在要做的是立即从
mainHand
中删除所有已经在
mainHand
中的条目。因此,我循环使用这两种方法,比较
id
unset()
如果有匹配的值

foreach($itemDB['offHand'] as $index => $item) {

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

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

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

        }

    }

}
然后我再次对其进行编码:

$newJSON=json\u encode($itemDB,json\u PRETTY\u PRINT)

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

{
    "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"
        }
    ]
}
{
    "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
是导致此问题的原因。

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

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

正如我所想,通过unset,您正在移除数组的一部分,使其不连续,因此它可能被转换为对象

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

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

PHP不会在JSON(它只是一个表示数组或对象等结构化数据的字符串)上循环,只会在数组上循环,因此您必须首先将JSON转换为一个数组才能在其上循环。当然,我之前对它进行了解码。我进行了编辑以澄清问题。那么,如果在json_对数组进行解码后,您var_转储了该数组,那么您将看到这些“附加键”确实已经存在有趣的效果。我学会了在当前循环的数组中不取消设置()。事实上并不奇怪,这样的事情会导致问题…请考虑评论下注,这样我就可以改善我的问题:-虽然这可能是一个解决方案,但它不回答“为什么”……这将神奇地创建一个PHP数组没有键值?没有数组是没有的,但是不管键是数字类型还是字符串。到目前为止,这个建议是正确的。。。除此之外,这是一个非常粗糙的尝试,试图在事后修复一些损坏的东西,使之成为可用的东西,这很少是一个好主意。。。。似乎是json_encode()以某种方式被破坏,或者根本无法处理非连续键。。。。想知道PHP7的新json处理是否会解决它确实起作用的问题,下面是一个关于原因的更完整的答案: