我的数据库中有一个表,其中包含许多家谱树。
-----------------------------
- 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","表弟的dauther"将不会显示,如果我使用"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>
我曾经遇到过类似的问题,这是我如何解决的。
-
循环访问数据集,将每个节点放在数组中,并跟踪要成为根节点的内容。
-
遍历数组。 对于parent_id不为 null 的每个节点,按 id 查找父节点,并将当前节点添加为子节点。 构建树时无需使用递归。
最后我相信我没有得到烤面包机的答案,但它让我思考,我最终解决了问题(仍然使用 ggorlen 显示树的方式(。
首先,这是查询:
$sql = "SELECT p1.id, p2.name, p2.id as minor, p2.name FROM pariente p1 INNER JOIN pariente p2 ON p1.id = p2.parent_id ORDER BY p1.id";
$result = $conn->query($sql);
$sql2 = "SELECT p1.id, p1.nombre, p1.padre_id FROM pariente p1 WHERE p1.padre_id IS NULL ORDER BY p1.id";
$raices = $conn->query($sql2);
功能:
function make_tree($resguardo, $root){
$tree = [];
$tree = $root;
foreach ($resguardo[$root["id"]] as $node) {
add($tree, $node, $resguardo);
}
return $tree;
}
function add(&$root, &$children, $resguardo){
$root["children"][$children["minor"]] = $children;
$flag= false;
if (isset($resguardo[$children["minor"]])) {
$flag = true;
}
if ($flag == false){
return;
} else {
foreach ($resguardo[$children["minor"]] as $child) {
agregar($root["children"][$children["minor"]], $child, $resguardo);
}
}
}
function preorder2(&$root) {
if ($root) {
echo "<li>";
echo '<a href="">';
echo $root["name"];
echo "</a>";
if (array_key_exists("children", $root)) {
echo "<ul>";
foreach ($root["children"] as $c) {
preorder2($c);
}
echo "</ul>";
}
echo "</li>";
}
}
我在这里称他们为:
while( $row = mysqli_fetch_assoc($result)){
$resguardo[$row["id"]][] = $row;
}
while( $root = mysqli_fetch_assoc( $roots)){
echo '<ul>';
$tree = make_tree($resguardo, $root);
preorder2($tree);
echo "</ul>";
}
非常感谢你们俩,没有你们的帮助,我永远不会解决它。