使用递归函数构建多维数组

时间:2012-06-08 15:45:51

标签: php mysql sql arrays recursion

问题:

我正在尝试使用MySQL中的函数和数据构建递归树。但是,结果并不像预期的那样。

PHP代码:

function buildTree($root, $next = array()) 
{
    // Sanitize input
    $root = (int) $root;

    // Do query
    $query = "SELECT CID, Item, Parent FROM betyg_category WHERE Status = '1' AND Parent = '{$root}'";
    $result = mysql_query($query) or die ('Database Error (' . mysql_errno() . ') ' . mysql_error());

    // Loop results
    while ($row = mysql_fetch_assoc($result)) 
    {
      $next[$row['CID']] = array (
                                'CID' => $row['CID'], 
                                'Item' => $row['Item'], 
                                'Parent' => $row['Parent'], 
                                'Children' => buildTree($row['CID'], $next)
                            );
    }

    // Free mysql result resource
    mysql_free_result($result);

    // Return new array
    return $next;
}

$testTree = buildTree(0);

echo "<xmp>".print_r($testTree, true)."</xmp>";

数据库中的表格如下所示:

enter image description here

我希望数组如下:

Array
(
    [1] => Array
    (
        [CID] => 1
        [Item] => Litteratur
        [Parent] => 0
        [Children] => Array
            (
                [2] => Integration av källorna
                [3] => Belysning av egna resultat
                [4] => Referenser
            )

    )

    and so forth..
)

也就是说,对于每个父母=&gt;生产孩子,然后转移到下一位家长等。提前感谢您的任何建议。

3 个答案:

答案 0 :(得分:2)

这里不需要递归。事实上,由于你最终遇到SELECT N + 1问题,它将非常无效。只需按父级排序结果集:

$query = "SELECT CID, Item, Parent FROM betyg_category WHERE Status = '1' ORDER BY Parent";
$result = mysql_query($query);

$tree = array();
while($row = mysql_fetch_assoc($result)) {
    if($row['Parent'] == 0) {
        $row['Children'] = array();
        $tree[$row['CID']] = $row;
    } else {
        $tree[$row['Parent']]['Children'][] = $row;
    }
}

这将产生以下结果:

Array
(
    [1] => Array
        (
            [CID] => 1
            [Item] => Litteratur
            [Parent] => 0
            [Children] => Array
                (
                    [0] => Array
                        (
                            [CID] => 2
                            [Item] => Integration av källorna
                            [Parent] => 1
                        )

                    [1] => Array
                        (
                            [CID] => 3
                            [Item] => Belysning
                            [Parent] => 1
                        )

                    [2] => Array
                        (
                            [CID] => 4
                            [Item] => Referenser
                            [Parent] => 1
                        )

                )

        )

    [5] => Array
        (
            [CID] => 5
            [Item] => Validitet
            [Parent] => 0
            [Children] => Array
                (
                    [0] => Array
                        (
                            [CID] => 6
                            [Item] => Huvudsyfte
                            [Parent] => 5
                        )

                )

        )

)

如果您只想要每个孩子的名字,请更改,使用$tree[$row['Parent']]['Children'][] = $row['Item'];代替。

答案 1 :(得分:2)

试试这个:

$array = array();
while ($row = mysql_fetch_assoc($result)) 
{
    if($row['parent'] == '0')
    {
        $array[$row['parent']] = '';
        $array[$row['parent']]['CID'] = $row['CID'];
        $array[$row['parent']]['Item'] = $row['item'];
        $array[$row['parent']]['Parent'] = $row['parent'];
        $array[$row['parent']]['Children'] = '';

    }
    else
    {
        $array[$row['parent']]['Children'][$row['CID']] = $row['item'];
    }
}
echo "<pre>";
print_r($array);

首先在您的查询中。添加ORDER BY CID ASC 然后

$count = array_keys($array);
foreach($count as $arr)
{
    ksort($array[$arr]['Children']);
}

答案 2 :(得分:0)

所有评论的最终解决方案:

$query = "SELECT * FROM betyg_category WHERE Status = '1' ORDER BY CID ASC";
$result = mysql_query($query) or die ('Database Error (' . mysql_errno() . ') ' . mysql_error());

$tree = array();

while($row = mysql_fetch_assoc($result)) 
{
    if($row['Parent'] == 0) 
    {
        $row['Children'] = array();
        $tree[$row['CID']] = array(
                                'CID' => $row['CID'], 
                                'Item' => $row['Item'], 
                                'Parent' => $row['Parent']
                            );
    } 
    else 
    {
        $tree[$row['Parent']]['Children'][$row['CID']] = $row['Item'];
    }
}

$count = array_keys($tree);

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

echo "<xmp>".print_r($tree, true)."</xmp>";