Подтвердить что ты не робот

JSON_ENCODE многомерного массива, дающего разные результаты

Когда я делаю json_encode многомерный массив в PHP, я замечаю другой вывод, просто назвав один из массивов, а не называя их. Например:

$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4));
json_encode($arrytest)

предоставляет один массив из нескольких объектов json

[{"a":1,"b":2},{"c":3},{"d":4}];

тогда как просто присваивание имени среднему массиву

$arrytest = array(array('a'=>1, 'b'=>2),"secondarray"=>array('c'=>3),array('d'=>4));
json_encode($arrytest)

создает один объект json с несколькими объектами json внутри

{"0":{"a":1,"b":2},"secondarray":{"c":3},"1":{"d":4}};

почему первый вариант не будет возвращать те же результаты, что и второй execpt с "1" вместо "secondarray"

4b9b3361

Ответ 1

В JSON массивы [] только у каждого есть числовые клавиши, тогда как объекты {} имеют свойства строки. Включение ключа массива в ваш второй пример заставляет всю внешнюю структуру быть объектом по необходимости. Внутренние объекты обоих примеров создаются как объекты из-за включения строковых ключей a,b,c,d.

Если вы использовали опцию JSON_FORCE_OBJECT в первом примере, вы должны вернуть аналогичную структуру ко второй, а внешняя структура - объекту, а не массиву. Не указывая, что вы хотите, чтобы он был объектом, отсутствие строковых ключей во внешнем массиве заставляет PHP предполагать, что он должен быть закодирован как эквивалентная структура массива в JSON.

$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4));

// Force the outer structure into an object rather than array
echo json_encode($arrytest , JSON_FORCE_OBJECT);

// {"0":{"a":1,"b":2},"1":{"c":3},"2":{"d":4}}

Ответ 2

Массивы с непрерывными числовыми ключами кодируются как массивы JSON. Вот как это. Зачем? Потому что это имеет смысл.

Поскольку ключи могут быть выражены неявно через кодировку массива, нет причин явно кодировать их как ключи объектов.

См. все примеры в json_encode документации.

Ответ 3

В первом варианте у вас есть только числовые индексы (0, 1 и 2). Хотя они явно не объявлены, php автоматически создает их.

Во втором варианте вы объявляете один из индексов в виде строки, и это заставляет PHP внутренне преобразовывать все индексы в строку.

Когда вы json кодируете первый массив, нет необходимости показывать целые числа в сгенерированной строке json, потому что любой декодер должен уметь "догадываться", что они равны 0, 1 и 2.

Но во втором массиве это необходимо, так как декодер должен знать значение ключа в вашем массиве.

Это довольно просто. Нет индексов, объявленных в массиве? Им они равны 0, 1, 2, 3 и т.д.