В моей базе данных есть таблица, в которой размещено множество генеалогических деревьев.
-----------------------------
- id name parent_id
-----------------------------
- 1 grandfather NULL
- 2 father 1
- 3 uncle 1
- 4 son 2
- 5 brother 2
- 6 cousin's dauther 7
- 7 cousin 8
- 8 auntie 1
Проблема в том, что я не могу показать все имена из-за пограничного случая:
-Когда у меня есть человек с parent_id, который больше, чем parent_id его родителя (см. дочь двоюродного брата)
Я использую эти запросы для получения таблицы:
$sql = "SELECT p1.id, p1.name, p1.parent_id FROM pariente p1
ORDER BY p1.parent_id";
$result = $conn->query($sql);
Проблема в том, что если я использую «ORDER BY parent_id», «дочь двоюродного брата» не будет отображаться, а если я использую «ORDER BY id», «двоюродный брат» не будет отображаться.
Я использую эти функции, чтобы превратить дерево в массив и нарисовать его:
function make_tree($data, $root) {
$tree = [];
foreach ($data as $node) {
insert($tree, $node);
}
return $tree;
}
function insert(&$root, &$node) {
if (!$root) {
$root = $node;
}
else if ($root["id"] === $node["parent_id"]) {
$root["children"][] = $node;
}
else if (array_key_exists("children", $root)) {
foreach ($root["children"] as &$c) {
if (insert($c, $node)) {
break;
}
}
}
}
function preorder2(&$root) {
if ($root) {
echo "<li>";
echo $root["name"];
if (array_key_exists("children", $root)) {
echo "<ul>";
foreach ($root["children"] as $c) {
preorder2($c);
}
echo "</ul>";
}
echo "</li>";
}
}
?>
И после того, как я использую это для вызова функций:
<div>
<?php
while( $row = mysqli_fetch_assoc( $result)){
$resguard[] = $row;
}
$tree = make_tree($resguard);
preorder2($tree);
?>
</div>