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}};

почему 1-й вариант не возвращает те же результаты, что и 2-й вариант с & quot; 1 & quot; вместо "второго массива"

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

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

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

Посмотреть все примеры вjson_encode documentation.

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

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

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

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

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

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

В 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}}

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