如何将PHP数组编码为JSON数组而不是对象?

9

我正在尝试对从Zend_DB查询返回的数组进行json_encode。

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个回答

13

你是如何设置初始数组的?

如果你的设置方式像这样:

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

如果你的数组索引不是数字而是字符串,那么在JS世界中它将被转换成对象。如果没有设置严格的顺序(例如从0开始而不是从1开始),这也可能会发生。

这只是一个猜测,因为我看不到你的原始代码:尝试一开始根本不使用键设置你的数组:

array(
 array(...),
 array(...),
);

2
+1 # 数组如果不以0为键开始,那么它就不是一个数组。PHP的问题在于它有一个奇怪的混合体,既不像数组也不像哈希表,因此无法正常工作。 - Kent Fredric
就像我说的那样,这并不是一个数组,而是一个带有数字键的哈希表,在这种情况下,它刚好在开始时接近0,因为数据库中的数据是这样的。 - Kent Fredric
你想要的从逻辑上讲是不可能的。 - Kent Fredric
1
+1 给 Kent... 真希望我能给你的评论点赞... 相反,我给了你的答案点赞 :) - Seb
@Kent,我也无法忍受PHP将哈希和数组视为同一物的做法。这也是许多人在JS中使用map = new Array(); map.prop ='blah'的原因。它们并不相同! - Ruan Mendes

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"}

as

["a","b","c"]

在Php中执行$data[1],你会得到"a",但是在JavaScript中,你会得到"b"。


2

在php中测试传统的连续数组的常见方法是检查索引'0'。尝试将其添加到您的数组中,它可能会将其视为数组而不是哈希映射。


-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中解码它以使其可用,可以通过将其传递给适当的JSON解析器或在稍后的某个地方执行 myJsVar = eval(myJsVar) 来完成。 - Kent Fredric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接