php - 在 PHP 中使用 PDO 动态构建多级菜单

标签 php mysql pdo hierarchy

我的数据库中有以下数据:

id  nameOfPerson    parent
3   John             NULL
4   Michel            3
5   Husam             4
6   Khalaf            5
7   Mark              5
----------------------------

我想像这样在列表中显示它

  • 约翰
    • 米歇尔
      • 胡萨姆
        • Karaf
        • 马克

但在我的代码中他只是显示

  • 约翰
    • 米歇尔

我想如何根据父列表显示所有数据?

这是我的功能有什么问题吗?

  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 。

代码

  • 首先,我从数据库表中检索所有数据,因为为每个增加数据库调用并影响响应时间的父级单独检索数据效率不高。

  • 构建父子关系数组,其中每个父子都有 每个子 的 2 个详细信息 - nameOfPersonid

  • 以递归方式遍历此数组并继续为每个子项构建列表并最终返回它们。

引用SQL Fiddle对于表行。

<?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>

关于php - 在 PHP 中使用 PDO 动态构建多级菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50580490/

相关文章:

PHP注册表格未连接到数据库

php - 如何正确地将依赖项注入(inject) Laravel artisan 命令?

mysql - 如何在 laravel 中获取所有模型/迁移名称并添加单个新列

php - PDO 在不同服务器中复制行一般错误

php - 基于每个事务的 PDO setAttribute

php - 在 Laravel 中自动发送电子邮件

php - PHP 代码中的 CSS 搞乱了 IE9 中的布局

mysql - 在 MySQL 中查找特定日期的重复条目

MySQL 唯一和索引

php - pdo lastInsertId 返回零(0)