PHP动态下拉菜单

PHP动态下拉菜单,php,menu,drop-down-menu,Php,Menu,Drop Down Menu,情况如下: 我有一个菜单,需要从数据库中动态创建。 菜单层次结构由表中的“父”列确定(每个条目都有一个父项,如果它只是父项,则为NULL) 问题是,考虑到我的下拉菜单需要适当的结构,我想不出如何动态地执行此操作。 这要求我在父页面的foreach中有我的子页面的foreach? 如果这有道理,有解决办法吗 仅供参考:我正在处理的阵列返回: array(31) { [0]=> array(5) { ["id"]=> string(2) "31" ["title"]=&g

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

问题是,考虑到我的下拉菜单需要适当的结构,我想不出如何动态地执行此操作。 这要求我在父页面的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:


不需要递归

$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']);
  }
}
现在,在以父项命名的数组中列出了属于父项的所有链接。其他链接位于单独的数组中。如果你愿意,你可以加入他们


根据应用程序的需要对其进行扩展。

插入所有内容后,我只列出了没有子页面的父页面。现在再看一下,我忘了在函数中的output_lis()调用周围加一个
    。请参阅已编辑的解决方案…输出的仍然是父级。源代码仅显示包装菜单的
      和在中创建的
    • ,但仅显示父元素为NULL的元素的
    • s。从好的方面来说,我相信您。另一方面,我用一些我已经使用过的函数解决了这个问题。但是,使用递归函数的方式几乎相同。这是否足够灵活,可以处理三层菜单?在某些情况下,我有第1页->第2页->第3页。这里有一个缺陷:第一次没有为$parents[$ar['parent']]定义数组,所以数组推送无法工作。我相信您可以使它足够灵活。这只是一个简单的例子。
      <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), 
          );
      
      $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']);
        }
      }