如何让php`json_encode`返回Javascript数组而不是Javascript对象?

时间:2016-04-20 13:08:32

标签: javascript php arrays json

我在PHP中有一个包含对象列表的数组:

// This is a var_dump of $data

array(3911) {
  [0]=>
  object(stdClass)#44 (3) {
    ["ID"]=>
    string(1) "1"
    ["name"]=>
    string(9) "Forest"
  }
  [1]=>
  object(stdClass)#43 (3) {
    ["ID"]=>
    string(1) "2"
    ["Name"]=>
    string(3) "Lt. Dan"
  }

  // etc ...
}

我正在将该数组转换为基于平面索引的数组:

$return = [];
$length = count($data);
$return = array_fill(0, $length, null);

// Convert list into flat array
foreach ( $data as $item ){
  $return[(int)$item->ID] = $item->name;
}

header( 'Content-Type: application/json' );
echo json_encode( $return );

我在json_encode获得的结果是一个对象列表:

{"0":null,"1":"Forest","2":"Lt. Dan","3":"Bubba","4":"Jenny"}

我期待得到的是:

[null,"Forest","Lt. Dan","Bubba","Jenny"]

如何让json_encode返回Javascript数组而不是Javascript对象?

旁注The Manual says

  

对数组进行编码时,如果键不是从0开始的连续数字序列,则所有键都编码为字符串,并为每个键值对明确指定。

但我的数组是一个连续的集合,这就是我使用array_fill的原因。

2 个答案:

答案 0 :(得分:4)

<强>更新

重新解释问题:

  

期望的是索引对应于给定ID的数组   对象。对于每个缺少的ID,该索引处的数组项必须是   null

从提供的示例中可以看出,$data中的对象的ID是零索引,因此我们初始化并使用max(ID) + 1的长度进行数组,并像以前一样填充它。 然而和恕我直言,我认为这将是误用的数组数据结构。如果您的ID存在巨大差距,则您的阵列将包含大量null个。由于JS没有关联数组,因此最好的选择是将数组转换为对象(就像PHP在您的情况下所做的那样)。

由于没有给出$data,这是我提出的最好的结果:

如果你有一个关联数组,通常json_encode会返回一个对象,否则你会得到一个普通的JSON数组。所以你可能想尝试这样的事情:

echo json_encode( array_values($return) );

答案 1 :(得分:0)

如果您的ID不是连续的,那么count($data)将无法提供您要查找的结果。例如,如果$data具有密钥1,2,3和5;然后array_fill只会在$return上为您提供0-3键,并且您最终会得到一个非顺序数组。

请改为尝试:

$return = [];
$length = max(array_keys($data));
$return = array_fill(0, $length, null);
相关问题