Как мне закодировать массив PHP в массив JSON, а не в объект?
Я пытаюсь json_encode массив, который возвращается из запроса Zend_Db.
Var_dump дает: (Добавление 0 элементов вручную не меняет картину.)
array(3) {
[1]=>
array(3) {
["comment_id"]=>
string(1) "1"
["erasable"]=>
string(1) "1"
["comment"]=>
string(6) "test 1"
}
[2]=>
array(3) {
["comment_id"]=>
string(1) "2"
["erasable"]=>
string(1) "1"
["comment"]=>
string(6) "test 1"
}
[3]=>
array(3) {
["comment_id"]=>
string(1) "3"
["erasable"]=>
string(1) "1"
["comment"]=>
string(6) "jhghjg"
}
}
Закодированная строка выглядит следующим образом:
{"1":{"comment_id":"1","erasable":"1","comment":"test 1"},
"2":{"comment_id":"2","erasable":"1","comment":"test 1"},
"3":{"comment_id":"3","erasable":"1","comment":"jhghjg"}}
Что мне нужно, так это:
[{"comment_id":"1","erasable":"1","comment":"test 1"},
{"comment_id":"2","erasable":"1","comment":"test 1"},
{"comment_id":"3","erasable":"1","comment":"jhghjg"}]
Именно так, как сказано в документации php.ini/json_encode, это должно выглядеть.
4 answers
Как вы настраиваете свой начальный массив?
Если вы настроите его следующим образом:
array(
"1" => array(...),
"2" => array(...),
);
Тогда у вас нет массива с числовыми индексами, а есть строки, и они преобразуются в объект в мире JS. Это также может произойти, если вы не установите строгий порядок (т.Е. начиная с 0 вместо 1).
Однако это выстрел в темноте, потому что я не вижу вашего исходного кода: попробуйте установить свой массив вообще без использования ключей:
array(
array(...),
array(...),
);
Добавлена информация, расширяющая ответ Seb.
php > print json_encode( array( 'a', 'b', 'c' ) ) ;
["a","b","c"]
php > print json_encode( array( 0 => 'a', 1 => 'b', 2 => 'c' ) ) ;
["a","b","c"]
php > print json_encode( array( 1 => 'a', 2 => 'b', 3 => 'c' ) ) ;
{"1":"a","2":"b","3":"c"}
php >
Примечание: его форматирование таким образом с уважительной причиной:
Если бы вы отправили
{"1":"a","2":"b","3":"c"}
Как
["a","b","c"]
Когда вы сделали $data[1]
в Php, вы получили бы обратно "a", но на стороне JavaScript вы получили бы обратно "b".
Распространенный способ проверки традиционного непрерывного массива в php - это проверка индекса "0". Попробуйте добавить это в свой массив, он, вероятно, будет считать его массивом, а не хэш-картой.
У меня была похожая проблема, я заставил ее работать после добавления " (одинарных кавычек) вокруг строки json_encode. Следующее из моего js-файла:
var myJsVar = <?php echo json_encode($var); ?> ; -------> NOT WORKING
var myJsVar = '<?php echo json_encode($var); ?>' ; -------> WORKING