У меня есть простой массив:
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», заключается в том, что для назначения данных в obeject вы должны назначить это свойство, так как имена свойств не заданы разработчиком (только данные), кодер использует индексы массива как свойство имена, потому что это единственные имена, которые имели бы смысл.
Примечание. В соответствии с руководством PHP параметры параметров доступны только с PHP 5.3.
Для более старых версий PHP обратитесь к ответу chelmertz за способ сделать 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:
array ("0" => array (0,1,2,3), "1" => array (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 пытался быть умным, чтобы помогать идиотским людям, которые не могут отличить строки от ints, но в процессе испортил любой законно использующий строки в качестве индексов, независимо от того, к какому значению МОЖЕТ быть превращено.