从mysql输出中有效地创建json - 在唯一身份内进行分组

时间:2009-12-22 00:32:21

标签: php mysql json performance

我相信我一直在编写一些效率低下的代码,但似乎无法找到一种更有效的编写方式。

这经常发生在json输出中,尽管我也遇到了一些html或xml输出的问题。

我在我的数据库中运行一个查询,它返回一个数组。说一个人最喜欢的食物。 php的mysql_fetch_assoc返回

 
Array([person]=>john [food]=>chocolate)
Array([person]=>john [food]=>pizza)
Array([person]=>john [food]=>coffee)
Array([person]=>susan [food]=>licorice)

要创建我的json或html,我一直在寻找独特的人,然后添加这样的食物

$jsonOut=''
$personAdd='';
while($gotArray=mysql_fetch_assoc(foodArray)){

if($personAdd!='$gotArray['person']){
$jsonOut.="person: $gotArray['person'], foods{";
}
$jsonOut.="food:$gotArray['food'],";
rtrim(jsonOut,',');
$jsonOut.="}";
$personAdd=$array['person'];
}

现在,当你只有一个在mysql响应中不断重复的值时,这不是什么大不了的事,但是当你开始有4或5列的值相同时,它开始变得非常冗长。

有更好的方法吗?

-------------澄清输出应该是什么样的----------------- 上述数组的最终json应如下所示

[
    {
        "person": "john",
        "foods": [
            {
                "food": "chocolate",
                "food": "pizza",
                "food": "coffee" 
            } 
        ] 
    },
    {
        "person": "susan",
        "food": "licorice" 
    }
]

或苏珊会有“食物”:[{“food”:“licorice”}]类似的东西。

4 个答案:

答案 0 :(得分:5)

使用json_encode:

$persons = array ();
while ($row = mysql_fetch_assoc($result))
{
    if (empty($persons[$row['person']]))
        $persons[$row['person']] = array ();
    array_push ($persons[$row['person']], $row['food']);
}

echo json_encode ($persons);

它应该导致以下结果:

{
    'john': [
        'chocolate',
        'pizza',
        'coffee'
    ],
    'susan': [
        'licorice'
    ]
}

希望这有帮助

答案 1 :(得分:1)

这有点像kludge,但是使用mysql的帮助来寻找更快一点的方法就是使用这个查询:

SELECT person, GROUP_CONCAT(food) AS foods FROM table GROUP BY person

然后你有一个字符串用于你可以分成数组的食物

$persons = [];
while($person = mysql_fetch_assoc(foodArray)){
    $person['foods'] = explode(", ", $person['foods']);
    array_push($persons, $person);
}
$jsonOut = json_encode($persons);

更简单,即使它有点像黑客。另外,我还建议使用json_encode来滚动你自己的json。我的php生锈了,所以我不确定这段代码是100%正确但是它在球场。

答案 2 :(得分:0)

不是完美的答案,但

$array = array();
while($gotArray=mysql_fetch_assoc(foodArray)){
 $array[] = $gotArray;
};
$jsonOut = array2json($array);

现在array2json不存在,尽管有其他几个版本编码。你可以使用json_encode($ array);这将是接近但不正确。

答案 3 :(得分:0)

如何使用内置的php函数json_encode()

您还可以使用Zend Framework中的Zend_Json,它将自动使用本机php json函数(如果可用),如果没有,它就是自己的实现。