php unset in array foreach loop создает объект

У меня большой 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]); } } } с 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 .

После того, как вы закончите цикл, добавьте следующую строку кода, чтобы удалить ключи из элемента offHand array:

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