0

之前也有人问过这个问题,但我猜没有人回答。

假设mysql查询返回结果如下

name    |  id
tarun   |   1
tarun   |   2
tarun   |   3 

现在如果我们做标准的 json 编码,我会得到如下的东西:

[{"name":"tarun","id":"1"},{"name":"tarun","id":"2"},{"name":"tarun","id":"3"}]

但我的输出如下

[{"name" : "tarun", "ids" : [{"id": "1"},{"id": "2"},{"id": "3"}]}]

请忽略我的语法错误(如果有的话),但我希望我的问题有意义。我使用 PHP 作为我的后端脚本语言。

4

3 回答 3

1

你可能正在做类似的事情

SELECT name, id FROM ...

$data = array();
while ($row = mysql_fetch_assoc($result)) {
   $data[] = $row;
}

给定你想要的结构,你会想要

   $data[$row['name']]['ids'][] = array('id' => $row['id']);

这不会为您提供确切的结构,但会将所有 id 作为子数组放在由tarun字段值键入的数组下方。

于 2013-10-16T17:07:12.163 回答
0

扩展@Marc B的答案

// Getting per person id's list
$people = array();
while ($row = mysql_fetch_assoc($result)) {
    $people[$row['name']][] = array('id' => $row['id']);
}

// Encoding as JSON
$output = "[";

foreach ($people as $name => $ids) {
    $output .= '{"name" : "'.$name.'", ids: [';
    foreach ($ids as $key => $id) {
        $output .= '{"id" : "'.$id.'"},';
    }
    rtrim($output, ",");
    $output .= ']},';
}
rtrim($output, ",");
$output .= ']';

echo $output;

上面的解决方案特定于该问题。在我看来,针对此问题的通用 JSON 编码方法非常困难或不可能。

于 2013-10-16T17:21:06.330 回答
0

我建议使用按名称排序的查询,然后当您读取行时,只需简单检查 $row['name'] 是否已更改,如果是,请将您收集的 id 添加到 php 对象中。

$curName="";
$curIds=array();
$betterJ=array();
$result = mysql_query ("SELECT name,id FROM mytable WHERE 1 ORDER BY NAME);
while($row=mysql_fetch_array($result)
{
    if($curName=="")
        $curName=$row['name']

    if($row['name']!=$curName){
        $betterJ[]=array($name=>$curName,$ids=>$Ids)
        $curName=$row['name']
        $curIds=array()
    }
    $Ids[]=$row['id];
}
$betterJ[]=array($name=>$curName,$ids=>$Ids);
echo json_encode($betterJ);

自从我在这里写后,这可能有错字或其他东西,但它应该产生类似的 json

[ [name:"tarus1",ids:[1,2,3]], [name:"tarus2",ids:[4,5,6], ... ]  

你会在 html 等模板中工作得很好。

于 2013-10-16T17:31:54.287 回答