强制json_encode将(稀疏)数组编码为php中的索引数组

时间:2011-05-13 20:15:04

标签: php javascript json

我正在尝试使用JSON在主机和我的网页之间传输数组。在主机上,我有一个php脚本,它从mysql表中读取多行并从中创建一个数组。

$query="select ID,val,size from db;";
$result=mysql_query($query);
while ($row=mysql_fetch_assoc($result)) {
  $idx= (int) $row['ID'];
  $data[$idx]['val']=$row['val'];
  $data[$idx]['size']=$row['size'];
}

echo json_encode($data);

通常,ID在例如0和99之间线性递增。在这种情况下,json_encoded输出是一个数组(并且将被解释为javascript中的数组...如果我执行array.length ,我得到100作为答案)....
   有时,表中缺少一些行(可能没有idx = 40的行)...在这种情况下,数组是json_encoded作为对象的集合。在javascript中,如果我尝试查看array.length,我会得到一个未定义的结果。我想强制数据数组被解释为索引数组,缺少行的值为null / 0。是否有捷径可寻?看起来json_encode函数有一个强制编码作为关联数组的选项,但不是相反。

THX。

3 个答案:

答案 0 :(得分:1)

$query="select ID,val,size from db;";
$result=mysql_query($query);
$maxId = -1;
$defaultValue = null;
while ($row=mysql_fetch_assoc($result)) {
   $idx= (int) $row['ID'];
   if($maxId < $idx)
       $maxId = $idx;
   $data[$idx]['val']=$row['val'];
   $data[$idx]['size']=$row['size'];
}
for($i=0;$i<$maxId;$i++)
    if(!isset($data[$i))
        $data[$i] = $defaultValue;
echo json_encode($data);

答案 1 :(得分:1)

我将$ data定义为完整数组,然后替换其中的元素。

$data = array_fill($starting_index, 100, null);

$query="select ID,val,size from db;";
$result=mysql_query($query);
while ($row=mysql_fetch_assoc($result)) {
  $idx= (int) $row['ID'];
  $data[$idx]['val']=$row['val'];
  $data[$idx]['size']=$row['size'];
}

echo json_encode($data);

答案 2 :(得分:0)

这很烦人,但那是你的Javascript。我通常通过在数据结构中添加另一个级别来解决这个问题:

$data['size'] = count($myarray);
$data['array'] = $myarray;

echo json_encode($data);

通过这种方式,您可以获得“免费”的长度,而无需进行任何客户端循环/计数。