Как получить дочерние узлы дерева (справка по рекурсивной функции) - PullRequest
0 голосов
/ 01 ноября 2009

У меня есть двоичный файл, таблица базы данных отношений выглядит так:

+----+----------+---------+-----+
| id | parentID | childID | pos |
+----+----------+---------+-----+
|  1 |        1 |       2 | l   |
|  2 |        1 |       3 | r   |
|  3 |        2 |       4 | l   |
|  4 |        3 |       5 | r   |
|  5 |        4 |       6 | l   |
|  6 |        5 |       7 | r   |
+----+----------+---------+-----+

Я могу извлечь или потомков, например, 1 - но у меня есть очень неуклюжая функция для этого, поэтому мне нужно что-то, что работает лучше.

Вывод, который мне нужен, должен выглядеть следующим образом:

Array
(
    [0] => Array
        (
            [id] => 2
            [parentID] => 1
            [pos] => l
        )

    [1] => Array
        (
            [id] => 4
            [parentID] => 2
            [pos] => l
        )

    [2] => Array
        (
            [id] => 6
            [parentID] => 4
            [pos] => l
        )

    [3] => Array
        (
            [id] => 3
            [parentID] => 1
            [pos] => r
        )

    [4] => Array
        (
            [id] => 5
            [parentID] => 3
            [pos] => r
        )

    [5] => Array
        (
            [id] => 7
            [parentID] => 5
            [pos] => r
        )

)

До сих пор я придумал эту функцию, однако она возвращает вложенный массив, я хочу, чтобы он был сглажен ... но всякий раз, когда я пробовал это, он просто терпел неудачу.

function children($pid) {
    //set sql
    $sql = "SELECT * FROM relationships WHERE parentID = ".$pid;    
    //save query to result
    $result = mysql_query ($sql)
        or die("Bad request " . mysql_error()); 

    while ($item = mysql_fetch_array($result)):
        $topchild["id"] = $item["childID"];
        $topchild["parentID"]= $item["parentID"];
        $topchild["pos"] = $item["pos"];        

        $children[] = $topchild;
        $children[] = children($item["childID"]);       
    endwhile;


        return $children;
}

Что я там не так делаю?

1 Ответ

1 голос
/ 01 ноября 2009

Я хочу, чтобы это расправилось

$children[] = children($item["childID"]);  

вместо этого добавьте каждый из элементов в возвращаемое значение отдельно:

foreach (children($item['childID'] as $child)
    $children[]= $child;

(Также не следует инициализировать $topchild внутри цикла?)

Если вы делаете много рекурсивных запросов, подобных этой, таблица отношений родитель-потомок не является хорошим выбором структуры данных. Рассмотрим одно из иерархически ориентированных решений, таких как вложенные множества .

...