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

发布于 2024-11-06 23:17:54 字数 676 浏览 0 评论 0原文

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

谢谢。

I am trying to transfer an array between the host and my webpage using JSON. On the host, I have a php script which reads a number of rows from a mysql table and creates an array out of it.

$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);

Normally, the ID's are incremented linearly between, for example, 0 and 99.. In this case, the json_encoded output is an array (and will be interpreted as an array in javascript... If I do an array.length, I get 100 as the answer)....
Sometimes, a few of the rows are missing from the table (maybe there was no row with an idx=40)... In this case, the array is json_encoded as a collection of objects. In javascript, if I try to look at array.length, I get an undefined result. I'd like to force the data array to be interpreted as an indexed array with null/0 values for missing rows. Is there an easy way to do this? It looks like the json_encode function has an option to force encoding as an associative array, but not the other way around.

Thx.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

蛮可爱 2024-11-13 23:17:54
$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);
$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);
黯然#的苍凉 2024-11-13 23:17:54

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

I would define $data as a full array and then replace elements inside of it.

$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);
不必你懂 2024-11-13 23:17:54

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

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

echo json_encode($data);

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

It's annoying, but that's Javascript for you. I usually work around this by adding another level to my data structure:

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

echo json_encode($data);

That way you get the length included for "free", without having to do any client-side looping/counting.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文