代码之家  ›  专栏  ›  技术社区  ›  Jason

PHP递归导航列表菜单帮助

  •  3
  • Jason  · 技术社区  · 15 年前

    我正在尝试将动态递归导航列表菜单添加到正在处理的网站。 场景是菜单有两个与parentID(preid)相关的级别。

    我的问题是我可以正确地显示第一级列表,但是我不能正确地显示第二级。我不确定在哪里添加第二级的ul和/ul标签。

    这就是我想要的

    <ul>
    <li>Item 1</li>
    <li>item 2</li>
    <li>item 3</li>
    <ul>
      <li>sub item 1</li>
      <li>sub item 2</li>
    </ul>
    <li>Item 4</li>
    <li>item 5</li>
    <ul>
      <li>sub item 1</li>
      <li>sub item 2</li>
    </ul>
    <li>item 6</li>
    </ul>
    

    这就是我得到的下面的代码:

        <ul>
      <li>item 1
        <ul>
        </ul>
      </li>
      <li>item 2
        <ul>
          <li>sub item 1</li>
          <ul>
          </ul>
          <li>sub item 2</li>
          <ul>
          </ul>
        </ul>
      </li>
      <li>Sports Injuries
        <ul>
        </ul>
      </li>
        </ul>
      </li>
    </ul>
    

    下面是我用来创建菜单的类文件:

    class Dynamic_Menu 
        {
            function getConfig()
            {
                $this->DB_SERVER = 'localhost';
                $this->DB_USER = '***';
                $this->DB_PASS = '***';
                $this->DB_NAME = '***';
    
            }
    
            function __construct()
            {
                $this->getConfig();
                $Conn = mysql_connect($this->DB_SERVER, $this->DB_USER, $this->DB_PASS);
                if (!$Conn)
                    die("Error: ".mysql_errno($Conn).":- ".mysql_error($Conn));
                $DB_select = mysql_select_db($this->DB_NAME, $Conn);
                if (!$DB_select)
                    die("Error: ".mysql_errno($Conn).":- ".mysql_error($Conn));
            }
    
            function select_row($sql)
            {
                //echo $sql . "<br />";
                if ($sql!="")
                {
                    $result = mysql_query($sql) or die("Error: ".mysql_errno().":- ".mysql_error());
                    if ($result)
                    {
                        while($row = mysql_fetch_array($result))
                            $data[] = $row;
                    }
                    return $data;
                }
            }
    
            function recordCount($sql)
            {
                if ($sql!="")
                {
                    $result = mysql_query($sql) or die("Error: ".mysql_errno().":- ".mysql_error());
                    if ($result)
                    {
                        $cnt = mysql_num_rows($result);
                        return $cnt;
                    }
                }
            }
    
            function getChild($id)
            {
                $menu = "";
                $str = "";
                $s = "SELECT * FROM vcms_sys_explorer WHERE preid = '$id' ";
                $res = $this->select_row($s);
                $menu .= '<ul>';
                for ($i=0;$i<count($res);$i++)
                {
                    $cnt_of_child = $this->recordCount("SELECT * FROM vcms_sys_explorer where preid = '".$res[$i][eid]."' ");
                    //if ($cnt_of_child > 0)
                    //  $str = '';
                    //else
                    //  $str = " (is sub menu item)";
    
                    $menu .= '<li>'. $res[$i][name].$str.'</li>';   
                    $menu .= $this->getChild($res[$i][eid]);
                }
                $menu .= '</ul>';       
                return $menu;
            }
    
            function getMenu($parentid)
            {
                $menu = "";
                $s = "SELECT * FROM vcms_sys_explorer WHERE preid = '$parentid'  ";
                $res = $this->select_row($s);
    
                $menu .= '<ul>';
    
                for ($i=0;$i<count($res);$i++)
                { 
                    $menu .= '<li>'.$res[$i][name].$this->getChild($res[$i][eid]).'</li>';
                    if ((count($res) - 1) > $i) {
                    }
                } 
    
                $menu .= '</ul>';
    
                return $menu;
            }
        }
    

    我用以下方式调用菜单:

    $menu = new Dynamic_Menu();
    $menu->getMenu(1);
    

    有人能帮我解释一下我需要在哪里放置2级UL和/UL标签吗?我这两天一直在用这个敲打我的头。 任何帮助都会非常感谢,谢谢…

    2 回复  |  直到 13 年前
        1
  •  11
  •   Daniel    15 年前

    在嵌套列表中,子列表将始终包含 在内部 列表元素——这就是它们嵌套的原因。您可以使用此格式(在通用代码中,但您应该了解基本概念)在一个函数中打印完整的列表:

    function get_list($parent) {
        $children = query('SELECT * FROM table WHERE parent_id = '.$parent);
        $items = array();
        while($row = fetch_assoc($children)) {
            $items[] = '<li>'.$row['name'].get_list($row['id']).'</li>';
        }
        if(count($items)) {
            return '<ul>'.implode('', $items).'</ul>';
        } else {
            return '';
        }
    }
    

    这将为您提供一个适当结构的列表,如下所示:

    <ul>
        <li>Item 1</li>
        <li>Item 2
            <ul>
                <li>Item 2.1</li>
                <li>Item 2.2</li>
            </ul>
        </li>
    </ul>
    
        2
  •  0
  •   Community Mohan Dere    8 年前

    尽管这个问题与 question 我2天前发布的,这是我试图用文件夹而不是数据库来做的结果。下面将遍历指定$path的目录和所有子目录,并在脚本运行完成后将结果显示在嵌套的无序列表中。希望它有帮助。

    <?php
    function readDirs($path){
        $dirHandle = opendir($path);
        echo "<ul>";
        while ($item = readdir($dirHandle)) {
            $newPath = $path . "/" . $item;
    
            if (is_dir($newPath) && $item != '.' && $item != '..') {
                echo "<li><a href='$newPath'>$item</a>";
                readDirs($newPath);
            }
        }
        echo "</li></ul>";
    }
    $path = "./galleries";
    readDirs($path);
    
    ?>