У меня есть двоичный файл, таблица базы данных отношений выглядит следующим образом:Как получить дерево узлов детей (рекурсивная функция справки)
+----+----------+---------+-----+
| 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;
}
Что мне делать не так?
Я не совсем следую за тобой. Каково ваше определение детей? Имеет ли узел id = 1 только один дочерний элемент (с id = 2) или вы считаете все узлы ниже 'id = 1' его дочерними элементами? Я также не понимаю вывод, который вы опубликовали. Он просто выглядит как дамп таблицы базы данных. Что особенного в этом? –
Узел id = 1 имеет двух (непосредственных) детей (2,3), у них есть другие дети (4,5,6,7) ... Я хочу иметь массив, похожий на тот, который я разместил где будут все дети данного родителя или указать его по параметру глубины (например, 0 = все, 1 = дети первого уровня и т. д.) - что я могу сделать, я просто не включил его в эту функцию – Smaug
Err, глядя на ваш table, я вижу связанный список, а не дерево: '1' указывает на себя (начало или корень),' 2' указывает на '1',' 3' указывает на '2' и т. д .:' 1 -> 2 -> 3 -> 4 -> 5 -> 6'. Ваш массив-вывод выглядит по-другому, хотя ... –