PHP json_encode как объект после PHP-массива unset ()

Я испытываю странное поведение сjson_encode после удаления ключа числового массива сunset, Следующий код должен прояснить проблему. Я запустил его как из CLI, так и из мода Apache:

Информация о версии PHP:

C:\Users\usr\Desktop>php -v
PHP 5.3.1 (cli) (built: Nov 20 2009 17:26:32)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies

Код PHP

<?php

$a = array(
    new stdclass,
    new stdclass,
    new stdclass
);
$a[0]->abc = '123';
$a[1]->jkl = '234';
$a[2]->nmo = '567';

printf("%s\n", json_encode($a));
unset($a[1]);
printf("%s\n", json_encode($a));

Выход программы

C:\Users\usr\Desktop>php test.php
[{"abc":"123"},{"jkl":"234"},{"nmo":"567"}]
{"0":{"abc":"123"},"2":{"nmo":"567"}}

Как видите, первый раз$a преобразуется в JSON, кодируется как массив javascript. Второй раз (послеunset вызов)$a закодирован как объект javascript. Почему это и как я могу предотвратить это?

 Spudley08 окт. 2010 г., 13:36
+1 потому что приятно видеть хорошо заданный вопрос. :)

Ответы на вопрос(3)

Решение Вопроса

Причина этого в том, что в вашем массиве есть дыра: у него есть индексы 0 и 2, но он пропускает 1. JSON не может кодировать массивы с дырами, потому что синтаксис массива не поддерживает индексы.

Вы можете кодироватьarray_values($a) вместо этого, который будет возвращать переиндексированный массив.

 sjkm13 дек. 2016 г., 11:41
@NullUserException Отличное дополнение! Все равно нужно было сортировать массив - убить двух зайцев одним выстрелом.
 zneak06 окт. 2010 г., 04:36
@NullUserException Хотя это будет иметь побочный эффект, ну, в общем, сортировка вашего массива.
 NullUserException06 окт. 2010 г., 04:35
В качестве альтернативы вы можете отсортировать массив после сброса элемента.
 leepowers06 окт. 2010 г., 04:46
Для тех, кто интересуетсяunset поведение, просмотрите следующую ссылку и прокрутите вниз до «Полезные функции»:us3.php.net/manual/en/language.types.array.php  «Функция unset () позволяет удалять ключи из массива. Помните, что массив не будет переиндексирован»

Попробуйте использовать параметр JSON_FORCE_OBJECT для json_encode, например:json_encode($a, JSON_FORCE_OBJECT) так что у вас всегда будет одинаковый результат.

В добавок кarray_values Технику можно использоватьarray_splice и удалите элемент и переиндексируйте за один шаг:

unset($a[1]);

Вместо:

array_splice($a, 1, 1);
 CookieMonster14 сент. 2015 г., 11:00
абсолютно идеальный способ сделать работу, не испортив коллекцию, спасибо!
 DQM19 янв. 2016 г., 07:54
Это. Самый элегантный способ.

Ваш ответ на вопрос