2012-08-17 29 views
2

我在MySQL的2个表如何将PHP中数组中的数组分组并编码为JSON?

section_id  name 
===================== 
1    Section1 
2    Section2 

类别

category_id  section_id  name 
    ========================================= 
    1     1   Category1 
    2     1   Category2 
    3     2   Category3 
    4     2   Category3 

这是我现在有:

$sections = mysql_query($sql_section) or die("Could not execute query."); 
$categories = mysql_query($sql_category) or die("Count not execute query"); 

$result = array('sectionlist' => array()); 
    for ($i=0; $i < mysql_num_rows($sections); $i++){ 
     for ($j=0; $j < mysql_num_rows($categories); $j++){ 
      if (mysql_result($sections,$i,"section_id") == mysql_result($categories,$j,"section_id")){ 
       $result['sectionlist'][] = array('sectionName' => mysql_result($sections,$i,"name"), 'categorylist' => array(array('category' => mysql_result($categories,$j,"name")))); 
      } 
     } 
    } 
echo json_encode($result); 

已经出来的结果是这样的:

{sectionlist:[ 
    {sectionName: "Section1", categoryList: [{categoryName: "category1"}]}, 
    {sectionName: "Section1", categoryList: [{categoryName: "category2"}]}, 
    {sectionName: "Section2", categoryList: [{categoryName: "category3"}]}, 
    {sectionName: "Section2", categoryList: [{categoryName: "category4"}]}, 
    ]} 

这不是预期的结果,从我来说,我想有一个对象,它看起来像这样:

{sectionlist:[ 
    {sectionName: "Section1", categoryList: [{categoryName: "category1"}, {categoryName: "category2"}]}, 
    {sectionName: "Section2", categoryList: [{categoryName: "category3"}, {categoryName: "category4"}]} 
]} 

因此,如何我可以将第1部分与第1部分和第2部分分组?

+2

请发布您正在执行的查询。另外,避免使用日期的mysql_ *函数。将它们用于新代码的程度高达 [灰心](http://php.net/mysql_query)。 更多现代化的替代品可供选择并更好地维护。 请考虑学习 [已准备好的陈述](http://en.wikipedia.org/wiki/Prepared_statement) 而不是使用 [PDO或MySQLi](http://php.net/manual/en/mysqlinfo。 api.choosing.php)。 当严格使用时,避免繁琐和手动转义部分,因此变得更容易堆积,因为副产品更安全使用。 请参阅[PDO教程](http://goo.gl/vFWnC)开始。 – gcochard 2012-08-17 00:09:43

+0

谢谢Greg。理解这点非常重要。 – Vicheanak 2012-08-17 00:53:04

回答

2

要回答您的问题,您需要先创建类别数组。

for ($i=0; $i < mysql_num_rows($sections); $i++){ 
    $categorylist = array(); 
    for ($j=0; $j < mysql_num_rows($categories); $j++){ 
     if (mysql_result($sections,$i,"section_id") == mysql_result($categories,$j,"section_id")){ 
      $categorylist[] = array('category' => mysql_result($categories,$j,"name"); 
     } 
    } 
    $result['sectionlist'][] = array('sectionName' => mysql_result($sections,$i,"name"), 'categorylist' => $categorylist)); 
} 

作为旁注,PHP encourages use of the other database extensions

1

@格雷格的评论是真正重要的是要注意以上。此外,我会建议重新编写您的查询作为单个查询与联接,以检索您想要的数据。我不是100%肯定,你需要什么,但它可能会是这样的:

SELECT section.section_id, category.name, section.name FROM category 
    LEFT JOIN section ON section.section_id = category.section_id; 

将返回键到他们相关的SECTION_ID和节名称类别名称的数组与(你也可以选择category_id,如果你愿意)。