2009-03-26 4 views
8

Я пытаюсь json_encode массив, который возвращается из запроса Zend_DB.Как кодировать массив PHP в массив JSON, а не объект?

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.

ответ

12

Как вы настраиваете свой начальный массив?

Если вы установите его, как:

array(
"1" => array(...), 
"2" => array(...), 
); 

, то вы не имеете массив с числовыми индексами, но строки, и это преобразуется в объект в JS мире. Это может произойти и в том случае, если вы не устанавливаете строгий порядок (т.е. начинаете с 0 вместо 1).

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

array(
array(...), 
array(...), 
); 
+2

+1 # массив, не начинающийся с 0 для его ключа, не является массивом. phps, хотя для того, чтобы иметь странного ублюдка lovchild массива/хеша, который работает правильно, как ни один. –

+0

Код - это то, что возвращается как результат запроса Zend_DB –

+0

Как я уже сказал, это не делает его массивом, что делает его хэшем с числовым ключом, который просто * бывает * в этом случае близок к 0 на start, потому что это то, что имеют данные в базе данных. –

2

Общим способом проверки традиционного непрерывного массива в php является проверка индекса «0». Попытайтесь добавить это в свой массив, он, вероятно, будет рассматривать массив вместо хэшмапа.

6

Добавлена ​​информация, которая расширяется на Ответ 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 вы бы верните «а», но со стороны JavaScript вы получите «b».

-3

У меня была аналогичная проблема, она работала после добавления «одиночных кавычек» вокруг строки json_encode. После моего файла js:

var myJsVar = <?php echo json_encode($var); ?> ; -------> NOT WORKING 
var myJsVar = '<?php echo json_encode($var); ?>' ; -------> WORKING 
+1

Это не имеет никакого смысла. Он будет расширяться до 'var myJsVar = '{" 1 ":" a "....}'', который является * строкой *, а не массивом. Вам придется каким-то образом расшифровать его в JS Land, чтобы сделать его пригодным для использования, либо передав его правильному парсеру JSON, либо где-то позже «myJsVar = eval (myJsVar'). –