【问题标题】:forcing json_encode to encode (sparse) array as indexed array in php强制 json_encode 将(稀疏)数组编码为 php 中的索引数组
【发布时间】:2011-08-25 05:35:00
【问题描述】:

我正在尝试使用 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 函数可以选择强制编码为关联数组,但反之则不行。

谢谢。

【问题讨论】:

  • 只是好奇,但你需要长度做什么?你不能像$data['length']=count($data)这样在数组中设置一个长度属性吗?如果您需要循环数据的长度,数字中的空白会弄乱它/报告不正确的长度值。您可以使用for in 循环(类似于 php foreach)。

标签: php javascript json


【解决方案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);

【讨论】:

  • 我注意到的一件事是,如果从 mysql 数据库中返回的行是乱序的(即 idx=1 先出来后 idx=0),那么即使它是一个完整的数组,它会被编码为对象的集合,而不是数组……提前分配和初始化数组似乎效果很好。
【解决方案2】:

我会将 $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);

【讨论】:

    【解决方案3】:

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

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

    这样您就可以“免费”获得包含的长度,而无需进行任何客户端循环/计数。

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 2018-08-22
      • 2022-08-11
      • 2017-06-23
      相关资源
      最近更新 更多