2

我需要从这样组织的 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);
4

2 回答 2

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数据类型是 anobject而不是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 
}
于 2012-06-13T03:41:40.280 回答
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;
    }
}
于 2012-06-13T03:49:51.410 回答