Проблема с json_encode()
Вопрос
у меня есть простой массив:
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 пытался быть умным, чтобы помочь идиотам, которые не могут отличить строки от целых чисел, но в процессе запутал любого, кто законно использует строки в качестве индексов, независимо от того, во что МОЖЕТ быть преобразовано значение.