PHP json кодируется как объект после отмены установки массива PHP()
Я испытываю странное поведение с json_encode
после удаления ключа числового массива с помощью unset
. Следующий код должен прояснить проблему. Я запустил его как из командной строки, так и в качестве мода 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. Почему это происходит и как я могу это предотвратить?
3 answers
Причина этого в том, что в вашем массиве есть отверстие: в нем есть индексы 0 и 2, но отсутствует 1. JSON не может кодировать массивы с отверстиями, потому что синтаксис массива не поддерживает индексы.
Вы можете кодировать array_values($a)
вместо этого, который вернет переиндексированный массив.
В дополнение к методу array_values
можно использовать array_splice
и удалить элемент и переиндексировать за один шаг:
unset($a[1]);
Вместо этого:
array_splice($a, 1, 1);
Попробуйте использовать опцию JSON_FORCE_OBJECT для json_encode, например: json_encode($a, JSON_FORCE_OBJECT)
, чтобы у вас всегда был один и тот же результат.