代码帮助,无限php菜单

代码帮助,无限php菜单

问题描述:

刚刚得到了这个代码,为我的菜单的2个级别工作。但我希望它能够以无限级别工作。 你们有没有想法从哪里开始? 现在,如果我在数据库中键入更多级别,它会显示“未定义的索引Linnk &标签行29”,并且已输入的新父级不显示。代码帮助,无限php菜单

$sql = "SELECT id, label, link_url, parent_id FROM dyn_menu ORDER BY parent_id, id ASC"; 
$items = mysql_query($sql); 
while ($obj = mysql_fetch_object($items)) { 
    if ($obj->parent_id == 0) { 
     $parent_menu[$obj->id]['label'] = $obj->label; 
     $parent_menu[$obj->id]['link'] = $obj->link_url; 
    } else { 
     $sub_menu[$obj->id]['parent'] = $obj->parent_id; 
     $sub_menu[$obj->id]['label'] = $obj->label; 
     $sub_menu[$obj->id]['link'] = $obj->link_url; 
     if (!isset($parent_menu[$obj->parent_id]['count'])) { 
      $parent_menu[$obj->parent_id]['count'] = 0; 
     } 
     $parent_menu[$obj->parent_id]['count']++; 
    } 
} 
mysql_free_result($items); 

function dyn_menu($parent_array, $sub_array, $qs_val = "menu", $main_id = "nav", $sub_id = "subnav", $extra_style = "foldout") { 
    $menu = "<ul id=\"".$main_id."\">\n"; 
    foreach ($parent_array as $pkey => $pval) { 
     if (!empty($pval['count'])) { 
      $menu .= " <li><a class=\"".$extra_style."\" href=\"".$pval['link']."?".$qs_val."=".$pkey."\">".$pval['label']."</a></li>\n"; 
     } else { 
      $menu .= " <li><a href=\"".$pval['link']."\">".$pval['label']."</a></li>\n"; 
     } 
     if (!empty($_REQUEST[$qs_val])) { 
      $menu .= "<ul id=\"".$sub_id."\">\n"; 
      foreach ($sub_array as $sval) { 
       if ($pkey == $_REQUEST[$qs_val] && $pkey == $sval['parent']) { 
        $menu .= "<li><a href=\"".rebuild_link($sval['link'], $qs_val, $sval['parent'])."\" target=\"_blank\">".$sval['label']."</a></li>\n"; 
       } 
      } 
      $menu .= "</ul>\n"; 
     } 
    } 

    $menu .= "</ul>\n"; 
    return $menu; 
} 

function rebuild_link($link, $parent_var, $parent_val) { 
    $link_parts = explode("?", $link); 
    $base_var = "?".$parent_var."=".$parent_val; 
    if (!empty($link_parts[1])) { 
     $link_parts[1] = str_replace("&amp;", "##", $link_parts[1]); 
     $parts = explode("##", $link_parts[1]); 
     $newParts = array(); 
     foreach ($parts as $val) { 
      $val_parts = explode("=", $val); 
      if ($val_parts[0] != $parent_var) { 
       array_push($newParts, $val); 
      } 
     } 
     if (count($newParts) != 0) { 
      $qs = "&amp;".implode("&amp;", $newParts); 
     } 
     return $link_parts[0].$base_var.$qs; 
    } else { 
     return $link_parts[0].$base_var; 
    } 
} 

echo dyn_menu($parent_menu, $sub_menu, "menu", "nav", "subnav"); 

为了做到这一点,您需要使用递归函数来处理数组 - >列表转换。

下面是一个例子:

<?php 
function arrToUl($arr) { 
    $out = '<ul>'; 
    foreach($arr as $key=>$val) { 
     $out .= '<li>'; 
     $out .= is_array($val) ? arrToUl($val) : $val; 
     $out .= '</li>'; 
    } 
    return $out . '</ul>'; 
} 

$arr = array('firstval','secondval',array('firstval2','secondval2',array('firstval3','secondval3',array('firstval4','secondval4',array('firstval5','secondval5'))))); 
echo arrToUl($arr); 

输出在jsfiddle

+0

非常感谢您的建议。我如何将它与我的代码一起融合? :-) – simon

+0

你想重写'ternary'成更适合你的情况的东西。 –