我有一个大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
中的所有条目。所以我循环遍历两者,比较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_encode($itemDB, JSON_PRETTY_PRINT);
删除重复项是可行的,但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