Вопрос

у меня есть простой массив:

array
  0 => string 'Kum' (length=3)
  1 => string 'Kumpel' (length=6)

когда я кодирую массив с помощью json_encode(), я получаю следующее:

["Kum","Kumpel"] 

Мой вопрос в том, какова причина получения ["Kum","Kumpel"] вместо { "0" : "Kum", "1" : "Kumpel" }?

Это было полезно?

Решение

Скобки «{}» указывают объект, а «[]» используются для массивов в соответствии со спецификацией JSON.Массивы не имеют перечисления, если вы посмотрите на это с точки зрения распределения памяти.Это просто данные, за которыми следуют дополнительные данные, объекты с другой стороны имеют свойства с именами, и данные присваиваются свойствам, поэтому для кодирования такого объекта вы также должны передать правильные имена свойств.А вот для массива индексы указывать не нужно, потому что они всегда будут 0..n, где n — длина массива — 1, единственное, что имеет значение — это порядок данных.

$array = array("a","b","c");
json_encode($array); // ["a","b","c"]
json_encode($array, JSON_FORCE_OBJECT); // {"0":"a", "1":"b","2":"c"}

Причина, по которой JSON_FORCE_OBJECT заставляет его использовать «0,1,2», заключается в том, что для назначения данных объекту вы должны назначить их свойству, поскольку разработчик не задает имена свойств (только данные), кодер использует индексы массива в качестве свойства. имена, потому что это единственные имена, которые имеют смысл.

Примечание:в соответствии с Руководство по PHP параметры опций доступны только начиная с PHP 5.3.

Для более старых версий PHP обратитесь к ответу Челмерца, чтобы узнать, как заставить json_encode использовать индексы.

Другие советы

Как сказал Гамбо, со стороны JS это не имеет значения.Чтобы принудительно включить PHP, попробуйте следующее:

$a = new stdClass();
$a->{0} = "Kum";
$a->{1} = "Kumpel";
echo json_encode($a);

Не так удобно, я бы придерживался обозначения массива.

Просто приведите его как объект, и все будет работать нормально... параметр JSON_FORCE_OBJECT делает то же самое.

json_encode((object)$array);

Не забудьте преобразовать его обратно в массив php, чтобы вы могли получить доступ к его значениям в php:

$array = (object)$array;
$array = (array)$array;

json_encode($array);

Поскольку у вас есть массив PHP только с числовыми ключами, нет необходимости использовать объект JavaScript.Но если он вам нужен, попробуйте предложение Майку Мори.

Лично я считаю, что это ошибка, которую необходимо исправить в PHP.JSON_FORCE_OBJECT — это абсолютно не ответ.Если вы попытаетесь выполнить какое-либо общее программирование, вы постоянно будете спотыкаться.Например, следующее допустимо для PHP:

массив("0" => массив(0,1,2,3), "1" => массив(4,5,6,7));

И должен быть преобразован в

{"0": [0,1,2,3], "1": [4,5,6,7]}

Однако PHP ожидает, что я либо приму

[[0,1,2,3],[4,5,6,7]]

или

{"0":{"0":1,"1":1,"2":2,"3":3},"1":{"0":4,"1":5,"2":6,"3":7}}

Ни то, ни другое совершенно не верно.Как я могу декодировать такой объект?Какая возможная причина когда-либо менять что-то, что явно использует строки в качестве индексов?Это похоже на то, как будто PHP пытался быть умным, чтобы помочь идиотам, которые не могут отличить строки от целых чисел, но в процессе запутал любого, кто законно использует строки в качестве индексов, независимо от того, во что МОЖЕТ быть преобразовано значение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top