繁体   English   中英

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

[英]php unset in array foreach loop creates an 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中的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 ,但是offHand数组被更改为如下所示的对象(或assoc数组):

{
    "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造成的原因。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM