2009-12-22 87 views
2

我相信我一直在写一些低效率的代码,但似乎无法找出更有效的方式来写它。从mysql输出高效创建json - 独特内部的分组

这经常发生在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" 
    } 
] 

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

+0

假设它是由它需要被压实的递归函数应该顺序进行排序能够创建array2json递归重复。也许有人会用赏金为你创造一个。 – MindStalker 2009-12-22 02:21:33

回答

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' 
    ] 
} 

希望这有助于

+0

谢谢K Prime。看起来这可能是这样做的方式。对我所得到的不是很大的改进,但绝对是一种改进。更简洁,更易于理解。但我认为也许有更好的办法。 – pedalpete 2009-12-23 23:07:11

0

不完美的答案,但

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

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

+0

我给了一个尝试,但我最终在输出中的重复值。所以我不会以Person结尾:约翰,食物{食物:巧克力,食物:比萨......我得到{人物:约翰,食物:巧克力},{人物:约翰,食物:比萨},... – pedalpete 2009-12-22 01:41:23

0

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

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

+0

json_encode会将每个返回的数组编码为json。除非我错误地使用它,否则它不会将类似的属性组合到我要查找的输出中。 – pedalpete 2009-12-23 05:11:36

1

这是一个有点杂牌的,而是做你想找的使用快一点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%正确的,但它在球场中。

+0

感谢Rob,你在本例中使用GROUP_CONCAT是正确的。对于非常简单的用户,我认为GROUP_CONCAT可以很好地工作。随着事情变得越来越深,查询变得越来越大,我不太确定。但是你可以在盒子外面思考。 – pedalpete 2009-12-23 23:05:22

+0

我同意,这不是一个复杂的查询很好的解决方案。首先,分裂是非常天真的,所以你最好不要在你的价值观上逗号。此外,group_concat的长度上限对于较大的值集来说是成问题的。 – 2009-12-24 00:40:30