用 php 显示存储在数据库中的系谱树
Show with php a Genealogy tree stored in Database
我的数据库 (mysql) 中有一个 table 具有下一个模式:
-----------------------------
- id name parent_id
-----------------------------
- 1 grandfather NULL
- 2 father 1
- 3 uncle 1
- 4 son 2
- 5 brother 2
- 6 sister 2
我想通过以下方式在我的页面上显示它:
grandfather
father
son
brother
sister
Uncle
(前序遍历)
这是我找到的最佳解决方案(无效)
$sql = "SELECT p1.id, p1.name, p1.parent_id FROM tree p1 ORDER BY p1.id";
$result = $conn->query($sql);
while($row = mysqli_fetch_assoc($result)) {
arbol($row, $result);
};
function arbol($fila, $result) {
echo $fila["name"] . "<br>";
$flag = false;
while($busqueda = mysqli_fetch_row($result)) {
if($busqueda[2]==$fila["id"]){
$flag = true;
break;
}
};
if ($flag){
foreach ($result as $ruta) {
if($ruta["parent_id"]==$fila["id"]){
arbol($ruta, $result);
};
};
} else {
return;
}
};
};
因此,我第一次遍历到底部,但从未遍历到树的其余部分:
Grandfather
parent
son
我做错了什么?或者你有什么建议?
注意:完成后我会有很多 "grandfathers" 这就是为什么会有 while(我会在那里添加一个 "parent_id=NULL" 条件)。
编辑:
这样做后行的结构:
while( $row = mysqli_fetch_assoc( $result)){
$resguard[] = $row;
}
print_r($resguard);
这是(为清楚起见而格式化):
Array (
[0] => Array ( [id] => 1 [name] => Grandfather [parent_id] => )
[1] => Array ( [id] => 2 [name] => Parent [parent_id] => 1 )
[2] => Array ( [id] => 3 [name] => Uncle [parent_id] => 1 )
[3] => Array ( [id] => 4 [name] => Son [parent_id] => 2 )
[4] => Array ( [id] => 5 [name] => Brother [parent_id] => 2 )
[5] => Array ( [id] => 6 [name] => Sister [parent_id] => 2 )
)
这是一个适用于您的数据集的示例,并假设原始数据按 id 排序(正如您的查询所做的那样)。我相信要走的路是编写小的(er),简单的(r)函数,将数据转换为树并逐步遍历它。或许可以从数组开始遍历,然后一步一步打印出来,但我脑子暂时想不出好办法。
function make_tree($data) {
$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 preorder(&$root) {
if ($root) {
yield $root;
if (array_key_exists("children", $root)) {
foreach ($root["children"] as $c) {
yield from preorder($c);
}
}
}
}
$data = [
["id" => 1, "name" => "Grandfather", "parent_id" => null],
["id" => 2, "name" => "Father", "parent_id" => 1],
["id" => 3, "name" => "Uncle", "parent_id" => 1],
["id" => 4, "name" => "Son", "parent_id" => 2],
["id" => 5, "name" => "Brother", "parent_id" => 2],
["id" => 6, "name" => "Sister", "parent_id" => 2]
];
$tree = make_tree($data);
foreach (preorder($tree) as $node) {
echo $node["name"]."\n";
}
输出:
Grandfather
Father
Son
Brother
Sister
Uncle
我的数据库 (mysql) 中有一个 table 具有下一个模式:
-----------------------------
- id name parent_id
-----------------------------
- 1 grandfather NULL
- 2 father 1
- 3 uncle 1
- 4 son 2
- 5 brother 2
- 6 sister 2
我想通过以下方式在我的页面上显示它:
grandfather
father
son
brother
sister
Uncle
(前序遍历)
这是我找到的最佳解决方案(无效)
$sql = "SELECT p1.id, p1.name, p1.parent_id FROM tree p1 ORDER BY p1.id";
$result = $conn->query($sql);
while($row = mysqli_fetch_assoc($result)) {
arbol($row, $result);
};
function arbol($fila, $result) {
echo $fila["name"] . "<br>";
$flag = false;
while($busqueda = mysqli_fetch_row($result)) {
if($busqueda[2]==$fila["id"]){
$flag = true;
break;
}
};
if ($flag){
foreach ($result as $ruta) {
if($ruta["parent_id"]==$fila["id"]){
arbol($ruta, $result);
};
};
} else {
return;
}
};
};
因此,我第一次遍历到底部,但从未遍历到树的其余部分:
Grandfather
parent
son
我做错了什么?或者你有什么建议?
注意:完成后我会有很多 "grandfathers" 这就是为什么会有 while(我会在那里添加一个 "parent_id=NULL" 条件)。
编辑: 这样做后行的结构:
while( $row = mysqli_fetch_assoc( $result)){
$resguard[] = $row;
}
print_r($resguard);
这是(为清楚起见而格式化):
Array (
[0] => Array ( [id] => 1 [name] => Grandfather [parent_id] => )
[1] => Array ( [id] => 2 [name] => Parent [parent_id] => 1 )
[2] => Array ( [id] => 3 [name] => Uncle [parent_id] => 1 )
[3] => Array ( [id] => 4 [name] => Son [parent_id] => 2 )
[4] => Array ( [id] => 5 [name] => Brother [parent_id] => 2 )
[5] => Array ( [id] => 6 [name] => Sister [parent_id] => 2 )
)
这是一个适用于您的数据集的示例,并假设原始数据按 id 排序(正如您的查询所做的那样)。我相信要走的路是编写小的(er),简单的(r)函数,将数据转换为树并逐步遍历它。或许可以从数组开始遍历,然后一步一步打印出来,但我脑子暂时想不出好办法。
function make_tree($data) {
$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 preorder(&$root) {
if ($root) {
yield $root;
if (array_key_exists("children", $root)) {
foreach ($root["children"] as $c) {
yield from preorder($c);
}
}
}
}
$data = [
["id" => 1, "name" => "Grandfather", "parent_id" => null],
["id" => 2, "name" => "Father", "parent_id" => 1],
["id" => 3, "name" => "Uncle", "parent_id" => 1],
["id" => 4, "name" => "Son", "parent_id" => 2],
["id" => 5, "name" => "Brother", "parent_id" => 2],
["id" => 6, "name" => "Sister", "parent_id" => 2]
];
$tree = make_tree($data);
foreach (preorder($tree) as $node) {
echo $node["name"]."\n";
}
输出:
Grandfather
Father
Son
Brother
Sister
Uncle