Как мне закодировать массив 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, это должно выглядеть.

Author: TRiG, 2009-03-26

4 answers

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

Если вы настроите его следующим образом:

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

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

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

array(
 array(...),
 array(...),
);
 12
Author: Seb, 2009-03-26 02:13:21

Добавлена информация, расширяющая ответ 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".

 6
Author: Kent Fredric, 2017-05-23 10:32:49

Распространенный способ проверки традиционного непрерывного массива в php - это проверка индекса "0". Попробуйте добавить это в свой массив, он, вероятно, будет считать его массивом, а не хэш-картой.

 2
Author: Richard Levasseur, 2009-03-26 02:10:28

У меня была похожая проблема, я заставил ее работать после добавления " (одинарных кавычек) вокруг строки json_encode. Следующее из моего js-файла:

var myJsVar =  <?php echo json_encode($var); ?> ;    -------> NOT WORKING  
var myJsVar = '<?php echo json_encode($var); ?>' ;   -------> WORKING
 -3
Author: harry, 2012-01-07 15:06:01