从数据库构建多维数组树


Build Tree multidimensional array from database

我如何使用php和mysql建立一个特定的数组布局无限递归循环?我已经写出了我的表,数组布局和我的尝试得到这项工作。

我花了几个小时来做这个,但是没有运气。

我试图建立一个php数组基于我的数据库,建立一个特定的布局时使用json_encode

我的数据库表如下所示

TABLE `info`         |    TABLE `relations`
+--------+-----------+    +--------+-----------+
| id     | name      +    | id     | parent_id |
+--------+-----------+    +--------+-----------+
| 2p03Me | sue       |    | b5ET7N | 2p03Me    |
| b5ET7N | john      |    | h7S4bk | b5ET7N    |
| h7S4bk | bob       |    | iMz4d7 | 2p03Me    |
| iMz4d7 | sam       |    | ixRpaH | iMz4d7    |
| ixRpaH | teddy     |    | k41BhX | ixRpaH    |
| k41BhX | dan       |    +--------+-----------+ 
+--------+-----------+
生成的数组应该如下所示:
Array
(
    [0] => stdClass Object
        (
            [text] => sue
            [nodes] => Array
                (
                    [0] => stdClass Object
                        (
                            [text] => john
                            [nodes] => Array
                                (
                                    [0] => stdClass Object
                                        (
                                            [text] => bob
                                        )
                                )
                        )
                    [1] => stdClass Object
                        (
                            [text] => teddy
                            [nodes] => Array
                                (
                                    [0] => stdClass Object
                                        (
                                            [text] => dan
                                        )
                                )
                        )
                )
        )
)

我已经尝试了几次,但我似乎不能得到这个工作。我最近也是最后一次尝试

    $tree = category_tree($mysqli, $origSnippet);
    function category_tree($mysqli, $catid, $tree = array()) {
        ?><pre><?php print_r($tree); ?></pre><?php
        $sql = "SELECT * FROM `relations` INNER JOIN `info` ON `relations`.`id`=`info`.`id` WHERE `relations`.`parent_snippet_id`='$catid'";
        $children = $mysqli->query($sql);
        while($child = $children->fetch_assoc()) {
            $tree[] = array('text' => "$child[name]/$child[id]");
            echo "$child[name]/$child[snippet_id]<br/>";
            category_tree($mysqli, $child['id'], $tree);
        }
        return $tree;
    }

如果您能提供任何帮助,我将非常感激。

## My Question ##

我如何使无限递归循环使用php和mysql建立一个特定的数组布局?我已经写出了我的表,数组布局和我的尝试得到这项工作。

我通过以下操作解决了这个问题:

$tree = array();
$node_id = 0;
$origSnippet = "2p03Me"; //THIS IS GOTTEN FROM A SEPERATE FUNCTION BUT WILL BE THE STARTING POINT OF THE LOOP
function hasChildNodes($mysqli, $snippetID) {
    $sql = "SELECT * FROM `relations` INNER JOIN `info` ON `relations`.`id`=`info`.`id` WHERE `relations`.`parent_id`='$snippetID'";
    return $mysqli->query($sql)->num_rows;
}
function buildTree($mysqli, $snippetID, $node_id, &$tree) {
    $sql = "SELECT * FROM `relations` INNER JOIN `info` ON `relations`.`id`=`info`.`id` WHERE `relations`.`parent_id`='$snippetID'";
    $snippets = $mysqli->query($sql);
    while($snippet = $snippets->fetch_assoc()) {
        $tree[$node_id] = Array("text" => $snippet['name']);
        if (hasChildNodes($mysqli, $snippet['id']) >= 1) {
            buildTree($mysqli, $snippet['id'], 0, $tree[$node_id]['nodes']);
        }
        $node_id++;
    }
}
$sql = "SELECT * FROM `info` WHERE `id`='$origSnippet' LIMIT 1";
$origSnippet = $mysqli->query($sql)->fetch_assoc();
$tree[$node_id] = Array("text" => $origSnippet['name']);
if (hasChildNodes($mysqli, $childSnippet) >= 1) {
    buildTree($mysqli, $childSnippet, $node_id, $tree[$node_id]['nodes']);
}