У меня большой 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