代码之家  ›  专栏  ›  技术社区  ›  Second View

用PHP中的PDO动态构建多级菜单

  •  1
  • Second View  · 技术社区  · 6 年前

    我的数据库中有这些数据:

    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>';      
    
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   nice_dev    6 年前

    假设

    • 每个孩子只有 1 起源。

    代码

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

    • 构建父级和子级的关联数组,其中每个父级有2个详细信息 each child - nameOfPerson id .

    参考 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>