Когда я делаю 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-й выпуск с «1» вместо «secondarray»,
В 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}}
При первом варианте у вас есть только числовые индексы (0, 1 и 2). Хотя они явно не объявлены, php автоматически создает их.
Во втором варианте вы объявляете один из индексов как строку, и это заставляет PHP внутренне преобразовывать все индексы в строку.
Когда вы json кодируете первый массив, нет необходимости показывать целые числа в сгенерированной строке json, потому что любой декодер должен уметь «догадываться», что они равны 0, 1 и 2.
Но во втором массиве это необходимо, так как декодер должен знать значение ключа в вашем массиве.
Это довольно просто. Нет индексов, объявленных в массиве? Им они равны 0, 1, 2, 3 и так далее.
Массивы с непрерывными числовыми ключами кодируются как массивы JSON. Вот как это. Зачем? Потому что это имеет смысл.
Поскольку ключи могут быть выражены неявно через кодировку массива, нет причин явно кодировать их как ключи объектов.
См. Все примеры в документации json_encode
.