【问题标题】:Help with PHP recursive navigation list menu帮助 PHP 递归导航列表菜单
【发布时间】:2010-05-26 03:00:23
【问题描述】:

我正在尝试将动态递归导航列表菜单添加到正在处理的网站。 场景是菜单有 2 个由 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 标签。在过去的两天里,我一直在用这个来敲打我的头。 任何帮助将不胜感激,谢谢...

【问题讨论】:

    标签: php recursion navigation html-lists


    【解决方案1】:

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

    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】:

    尽管这个问题与我两天前发布的question 并不完全相同,但这是我尝试使用文件夹而不是数据库的结果。以下将遍历指定 $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);
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多