PHP json_encode как объект после PHP-массива unset () - PullRequest
19 голосов
/ 06 октября 2010

Я испытываю странное поведение с 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. Почему это и как я могу предотвратить это?

Ответы [ 3 ]

19 голосов
/ 06 октября 2010

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

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

6 голосов
/ 06 октября 2010

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

unset($a[1]);

Вместо:

array_splice($a, 1, 1);
2 голосов
/ 08 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...