使用mysql中的递归php创建一个数组

时间:2012-06-13 03:27:50

标签: php mysql arrays recursion

我需要从像这样组织的mysql数据库中创建一个数组

id    description    parentId    
1      Level 1        0           
2      Level 2        0           
3      Level 1a       1   
4      Level 1b       1 
5      Level 1a1      3
6      Level 1a1a     5

这样输出就像这样:

Level 1
      Level 1a
           Level 1a1
                Level 1a1a
      Level 1b
Level 2

但是我当前的代码只输出到第二级,然后让其他每个孩子都成为自己的父级。以下是当前代码:

$query = "SELECT * FROM pB_test ORDER BY parentId ASC";
$result = mysql_query($query) or die ('Database Error (' . mysql_errno() . ') ' . mysql_error());

$tree = array();

while($row = mysql_fetch_assoc($result)) 
{
    if($row['parentId'] == 0) 
    {
        $row['Children'] = array();
        $tree[$row['id']] = array(
                                'id' => $row['id'], 
                                'description' => $row['description'], 
                                'parentId' => $row['parentId']
                            );
    } 
    else 
    {
        $tree[$row['parentId']]['Children'][$row['id']] = $row['description'];
    }
}

$count = array_keys($tree);

foreach ($count as $array)
{
    ksort($tree[$array]['Children']);
}

echo print_r($tree, true);

任何正确方向的帮助或推动都会很棒。干杯

更新:工作代码

    $results = array();
while($row=mysql_fetch_assoc($dbresult)) 
{ 
    $results[]=$row;

    $tree = null;
foreach($results as $result)
{
    $thisref = &$refs->{$result['id']};
    foreach($result as $k => $v)
    {
        $thisref->{$k} = $v;
    }
    if ($result['parentId'] == 0) {
        $tree->{$result['id']} = &$thisref;
    } else {
        $refs->{$result['parentId']}->children->{$result['id']} = &$thisref;
    }
}

$tree; // contains the newly sorted tree.

}

print_r($tree);

2 个答案:

答案 0 :(得分:4)

我发现这个用于将父子数组分组的代码非常棒。我已经在4个深度进行了测试,没有任何问题。但它不是一个递归函数。

$tree = null;
foreach($results as $result)
{
    $thisref = &$refs->{$result['id']};
    foreach($result as $k => $v)
    {
        $thisref->{$k} = $v;
    }
    if ($result['parentId'] == 0) {
        $tree->{$result['id']} = &$thisref;
    } else {
        $refs->{$result['parentId']}->children->{$result['id']} = &$thisref;
    }
}

$tree; // contains the newly sorted tree.

您可能需要对其进行一些修改才能完全适应您的情况。但基本上它会遍历所有结果并通过引用将它们组合在一起。

请注意,结尾$tree数据类型为object而不是array

祝你好运

<强>更新

您可以这样创建数组

$query = "SELECT * FROM pB_test ORDER BY parentId ASC";
$dbresult = mysql_query($query) or die ('Database Error (' . mysql_errno() . ') ' . mysql_error());

$results = array();
while($row=mysql_fetch_assoc($dbresult)) 
{ 
    $results[]=$row 
}

答案 1 :(得分:1)

如果您创建一个在创建对象时从id映射到对象的数组,那么您可以轻松地查找嵌套对象,这可能是最简单的。基本上是:

$tree = array();
$lookup = array();

while($row = mysql_fetch_assoc($result))  
{
    $object = array('id' => $row['id'],        
                    'description' => $row['description'],        
                    'parentId' => $row['parentId']);

    $lookup[$row['id']] = $object;

    $parentId = $row['parentId'];
    if ($parentId == 0)
    {
        $tree[] = $object;
    }
    else
    {
        $lookup[$parentId]['Children'][] = $object;
    }
}