数组foreach循环中的php unset创建一个对象
我有一个大JSON,看起来像这样:数组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" },
{
"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处理是否会解决它确实起作用的问题,下面是一个关于原因的更完整的答案: