显示所选父级的树状菜单

时间:2012-03-02 17:14:53

标签: php mysql menu tree

这里我建立一个树状菜单。可以通过其ID显示类别并显示其子项。 我的功能适用于两级菜单,但无法生成第三级。仅当单击第二级项目的ID时,才应显示第三级菜单。我也需要这个函数来跟踪节点的路径。如果给出第三级id而不是树,则应扩展到第三级。即孩子的父母,如果父母也有父母。 mySQL表

+-------+-----------+------------+
|  id   |  title    | parent_id  |
+-------+-----------+------------+
|   1   | Computers |    NULL    |
+-------+-----------+------------+
|   2   | Dell      |     1      |
+-------+-----------+------------+
|   3   | Laptops   |     2      |
+-------+-----------+------------+
|   4   | Desktops  |     2      |
+-------+-----------+------------+
|   5   | HP        |     1      |
+-------+-----------+------------+

PHP代码

<?php
 $sql = "SELECT * FROM category";
 $statement= $db->prepare($sql);
 $statement->execute();
 $categories = array();
 $rootCategories = array();
 while ( $row = $statement->fetchObject() ) {
        $row->childs = array();
        $categories[$row->id] = $row;
        if(empty($row->parent_id)) {
                $rootCategories[$row->id] = $categories[$row->id];
        } else {
                $categories[$row->parent_id]->childs[] = $categories[$row->id];
        }
 }

  function rederTreeById($records, $id=false) {
        echo '<ul>';
        foreach($records as $record) {
                if($id == $record->id) {
                        echo '<li>'.$record->title;
                        if(!empty($record->childs)) {
                                rederTreeById($record->childs);
                        }
                        echo '</li>';
                } else {
                        echo '<li>'.$record->title.'</li>';
                }
        }
        echo '</ul>';
 }


 rederTreeById($rootCategories, 1);
?>

例如 如果单击计算机,则

  • 计算机
    • 戴尔
    • HP

如果戴尔点击了

  • 计算机
    • 戴尔
      • 笔记本
      • 台式机
    • HP

1 个答案:

答案 0 :(得分:1)

我发现您的解决方案存在一个问题。检查ID if($id == $record->id)时,您只会匹配树中的当前级别。即选择ID为2的Dell与第一次迭代不匹配,因此您的函数不会遍历到下一级别。

您需要跟踪所选菜单的路径。

在你的情况下。当您选择戴尔时,您只会选择“计算机”,我是对的吗?

这样的事情怎么样:

...
  function rederTreeById($records, $path) {
        echo '<ul>';
        foreach($records as $record) {
                if(in_array($record->id, $path)) {
                        echo '<li>'.$record->title;
                        if(!empty($record->childs)) {
                                rederTreeById($record->childs, $path);
                        }
                        echo '</li>';
                } else {
                        echo '<li>'.$record->title.'</li>';
                }
        }
        echo '</ul>';
 }

 function getPath($id) {
    $path = array();
    $current=$id;
    $path[] = 1
    while(!is_null($categories[$current]->parent_id)) {
        $current=$categories[$current]->parent_id
        $path[] = $current;
    }
    return $path;
 }


$selectedId = 1;


 rederTreeById($rootCategories, getPath($selectedId));
...