在 PHP 中使用 PDO 动态构建多级菜单
Building Multi Level Menu Dynamically with PDO in PHP
我的数据库中有以下数据:
id nameOfPerson parent
3 John NULL
4 Michel 3
5 Husam 4
6 Khalaf 5
7 Mark 5
----------------------------
我想在这样的列表中显示它
- 约翰
- 米歇尔
- 胡萨姆
- 卡拉夫
- 马克
但在我的代码中他只是显示
- 约翰
- 米歇尔
我想如何根据上面列表中的父级显示所有数据?
这是我的函数,有什么问题吗?
public function familyTree(){
$query = "SELECT id, nameOfPerson, parent FROM person WHERE parent is null";
$statment = $this->db->prepare($query);
$statment->execute();
echo '<ul id ="family">';
while($family = $statment->fetch(PDO::FETCH_OBJ)){
echo '<li>'. $family->nameOfPerson;
$query1 = "SELECT id, nameOfPerson, parent FROM person WHERE parent = :id";
$statment1 = $this->db->prepare($query1);
$statment1->bindValue('id', $family->id);
$statment1->execute();
if($statment1->rowCount() > 0){
echo '<ul>';
while($family2 = $statment1->fetch(PDO::FETCH_OBJ)){
echo '<li>' . $family2->nameOfPerson . '</li>';
}
echo '</ul>';
}
echo '</li>';
}
echo '</ul>';
}
假设
- 每个child只有
1
parent.
代码
首先,我从数据库 table 检索所有数据,因为为每个 parent 增加数据库调用并影响响应时间单独检索数据效率不高。
构建一个 parent 和 children 的关联数组,其中每个 parent 都有 2 个 each child
- nameOfPerson
和id
.
以递归方式遍历此数组并继续为每个 child 构建列表,最终 return 它们。
参考 SQL Fiddle 以获得 table 行。
<?php
$pdo = new PDO("mysql:dbname=newdummy;host=localhost","root","");
$query = $pdo->query("Select * from hierarchy");
$family_tree = [];
$root_parent = -1;
$root_parent_name = "";
function makeTree($query,&$family_tree,&$root_parent,&$root_parent_name){
while($row = $query->fetch(PDO::FETCH_ASSOC)){
if(is_null($row['parent'])){
$root_parent = $row['id'];
$root_parent_name = $row['nameOfPerson'];
}else{
if(!isset($family_tree[$row['parent']])){
$family_tree[$row['parent']] = [];
}
$family_tree[$row['parent']][] = array($row['nameOfPerson'],$row['id']);
}
}
}
function buildList($family_tree,$parent){
$list = "<ul>";
foreach($family_tree[$parent] as $each_child){
$list .= "<li>" . $each_child[0];
if(isset($family_tree[$each_child[1]])){
$list .= buildList($family_tree,$each_child[1]);
}
$list .= "</li>";
}
$list .= "</ul>";
return $list;
}
makeTree($query,$family_tree,$root_parent,$root_parent_name);
echo "<ul>";
echo "<li>$root_parent_name";
echo buildList($family_tree,$root_parent);
echo "</li>";
echo "</ul>";
输出
<ul>
<li>John
<ul>
<li>Michel
<ul>
<li>
Husam
<ul>
<li>khalaf</li>
<li>Mark</li>
</ul>
</li>
</ul>
</li>
<li>Tross</li>
<li>David</li>
</ul>
</li>
</ul>
我的数据库中有以下数据:
id nameOfPerson parent
3 John NULL
4 Michel 3
5 Husam 4
6 Khalaf 5
7 Mark 5
----------------------------
我想在这样的列表中显示它
- 约翰
- 米歇尔
- 胡萨姆
- 卡拉夫
- 马克
- 胡萨姆
- 米歇尔
但在我的代码中他只是显示
- 约翰
- 米歇尔
我想如何根据上面列表中的父级显示所有数据?
这是我的函数,有什么问题吗?
public function familyTree(){
$query = "SELECT id, nameOfPerson, parent FROM person WHERE parent is null";
$statment = $this->db->prepare($query);
$statment->execute();
echo '<ul id ="family">';
while($family = $statment->fetch(PDO::FETCH_OBJ)){
echo '<li>'. $family->nameOfPerson;
$query1 = "SELECT id, nameOfPerson, parent FROM person WHERE parent = :id";
$statment1 = $this->db->prepare($query1);
$statment1->bindValue('id', $family->id);
$statment1->execute();
if($statment1->rowCount() > 0){
echo '<ul>';
while($family2 = $statment1->fetch(PDO::FETCH_OBJ)){
echo '<li>' . $family2->nameOfPerson . '</li>';
}
echo '</ul>';
}
echo '</li>';
}
echo '</ul>';
}
假设
- 每个child只有
1
parent.
代码
首先,我从数据库 table 检索所有数据,因为为每个 parent 增加数据库调用并影响响应时间单独检索数据效率不高。
构建一个 parent 和 children 的关联数组,其中每个 parent 都有 2 个
each child
-nameOfPerson
和id
.以递归方式遍历此数组并继续为每个 child 构建列表,最终 return 它们。
参考 SQL Fiddle 以获得 table 行。
<?php
$pdo = new PDO("mysql:dbname=newdummy;host=localhost","root","");
$query = $pdo->query("Select * from hierarchy");
$family_tree = [];
$root_parent = -1;
$root_parent_name = "";
function makeTree($query,&$family_tree,&$root_parent,&$root_parent_name){
while($row = $query->fetch(PDO::FETCH_ASSOC)){
if(is_null($row['parent'])){
$root_parent = $row['id'];
$root_parent_name = $row['nameOfPerson'];
}else{
if(!isset($family_tree[$row['parent']])){
$family_tree[$row['parent']] = [];
}
$family_tree[$row['parent']][] = array($row['nameOfPerson'],$row['id']);
}
}
}
function buildList($family_tree,$parent){
$list = "<ul>";
foreach($family_tree[$parent] as $each_child){
$list .= "<li>" . $each_child[0];
if(isset($family_tree[$each_child[1]])){
$list .= buildList($family_tree,$each_child[1]);
}
$list .= "</li>";
}
$list .= "</ul>";
return $list;
}
makeTree($query,$family_tree,$root_parent,$root_parent_name);
echo "<ul>";
echo "<li>$root_parent_name";
echo buildList($family_tree,$root_parent);
echo "</li>";
echo "</ul>";
输出
<ul>
<li>John
<ul>
<li>Michel
<ul>
<li>
Husam
<ul>
<li>khalaf</li>
<li>Mark</li>
</ul>
</li>
</ul>
</li>
<li>Tross</li>
<li>David</li>
</ul>
</li>
</ul>