【问题标题】:PHP Dynamic Drop Down MenuPHP 动态下拉菜单
【发布时间】:2010-08-17 04:51:07
【问题描述】:

情况如下: 我有一个需要从数据库动态创建的菜单。 菜单层次结构由表中的“父”列确定(每个条目都有一个父项,如果只是父项,则为 NULL)

问题是,考虑到我的下拉菜单需要适当的<ul><li><ul><li> 结构,我想不出我将如何动态执行此操作。 这要求我在父页面的 foreach 中有我的子页面的“foreach”? 如果这是有道理的,有没有解决办法?

仅供参考:我正在使用的数组返回:

array(31) { 
[0]=>  array(5)
     { ["id"]=>  string(2) "31" ["title"]=>  string(4) "Home" ["linkable"]=>  string(1) "1" ["parent"]=>  NULL ["override"]=>  string(1) " " } 
[1]=>  array(5)
     { ["id"]=>  string(2) "30" ["title"]=>  string(11) "Shop Online" ["linkable"]=>  string(1) "1" ["parent"]=> string(2) "31" ["override"]=>  string(4) "shop" } 

and on and on.

【问题讨论】:

    标签: php menu drop-down-menu


    【解决方案1】:

    您需要编写一个递归函数来执行此操作并让它自己调用。我尚未对此进行测试,但我认为它应该可以帮助您入门。我不认可这个函数的效率,因为它遍历数组中的每个项目并进行比较,即使每次运行只需要一两个项目(可能)。

    PHP:

    $arr = array(...);
    function output_lis($parentID = NULL){
        global $arr;
        $stack = array(); //create a stack for our <li>'s 
        foreach($arr as $a){ 
            $str = '';
                //if the item's parent matches the parentID we're outputting...
            if($a['parent']===$parentID){ 
                $str.='<li>'.$a['title'];
    
                        //Pass this item's ID to the function as a parent, 
                        //and it will output the children
                $subStr = output_lis($a['id']);
                if($subStr){
                    $str.='<ul>'.$subStr.'</ul>';
                }
    
                $str.='</li>';
                $stack[] = $str;
            }
        }
        //If we have <li>'s return a string 
        if(count($stack)>0){
            return join("\n",$stack);
        }
    
        //If no <li>'s in the stack, return false 
        return false;
    }
    

    然后将其输出到您的页面上。类似的东西:

    <ul>
        <?php echo output_lis(); ?>
    </ul>
    

    这是我的示例数组:

    $arr = array(
            array('title'=>'home','parent'=>NULL,'id'=>1), 
            array('title'=>'sub1','parent'=>1,'id'=>2), 
            array('title'=>'sub2','parent'=>1,'id'=>3), 
            array('title'=>'about us','parent'=>NULL,'id'=>4), 
            array('title'=>'sub3','parent'=>4,'id'=>5), 
            array('title'=>'sub4','parent'=>4,'id'=>6), 
        );
    

    【讨论】:

    • 全部插入后,我只列出了没有子页面的父页面。不过现在看多了。
    • 我忘记在函数内的 output_lis() 调用周围包裹一个
        。查看已编辑的解决方案...
    • 除了父母正在输出之外什么都没有。源代码仅显示了包装菜单的
        和在其中创建的
      • ,但仅显示了父级为 NULL 的元素的
    • 从好的方面来说,我相信你。另一方面,我想出了如何使用我已经使用的几个函数来做到这一点。使用递归函数的方式几乎相同。
    【解决方案2】:

    不需要递归。

    $parents = array();
    $noparents = array();
    foreach ($results as $ar) {
      if ( $ar['parent'] != NULL ) {
        $parents[$ar['parent']] = array();
        array_push($parents[$ar['parent']], $ar['title']);
      } else {
        array_push($noparents, $ar['title']);
      }
    }
    

    现在,您将所有属于父级的链接列在以父级命名的数组中。您的其他链接位于单独的数组中。如果你愿意,你可以加入他们。

    根据您的应用程序的需要扩展它。

    【讨论】:

    • 这是否足够灵活以处理三层菜单?在某些情况下,我有第 1 页 -> 第 2 页 -> 第 3 页。
    • 这里有一个缺陷:第一次没有为 $parents[$ar['parent']] 定义数组,所以 array_push 不起作用。
    • 我确信你可以让它足够灵活。这只是一个简单的例子。
    猜你喜欢
    • 2015-06-10
    • 2012-01-20
    • 2014-12-04
    • 2012-05-06
    • 2020-08-26
    • 2019-07-10
    • 2013-11-05
    相关资源
    最近更新 更多