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; вместо "второго массива"

 user110692528 мая 2012 г., 04:30
 dangel28 мая 2012 г., 04:45
Феликс Клинг, почему вы удалили мой тег json-encode? Я не говорю, что вы не должны этого делать, но я хочу убедиться, что я следую правильной процедуре тегирования, поскольку json-encode присутствует в моем коде, хотя я и применил бы его как правильный тег.

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

1 и 2). Хотя они явно не объявлены, php автоматически создает их.

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

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

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

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

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

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

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

 dangel28 мая 2012 г., 04:37
Я не говорю, что они не должны быть, поэтому я задавал вопрос.
Решение Вопроса

[] только у каждого есть цифровые клавиши, тогда как объекты{} имеют строковые свойства. Включение ключа массива во второй пример заставляет всю внешнюю структуру быть объектом по необходимости. Внутренние объекты обоих примеров сделаны как объекты из-за включения строковых ключей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}}
 28 мая 2012 г., 04:43
@ Брендан Почему это не имеет ничего общего с Javascript?
 28 мая 2012 г., 04:40
Тогда зачем называть это ОБРАЗЦОМ ОБЪЕКТА JAVASCRIPT, если он не имеет ничего общего с Javascript.
 dangel28 мая 2012 г., 04:42
Имеет смысл сейчас, спасибо за это объяснение, я думаю, что это заставит меня двигаться в правильном направлении.
 28 мая 2012 г., 04:47
@deceze Предыдущий комментарий, предоставляющий контекст для этого, был удален.
 28 мая 2012 г., 04:52
Да, теперь это выглядит глупо, что у меня это было там. Для справки кто-то сказал, что JSON не имеет ничего общего с Javascript.

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