2012-10-18 64 views
0

剛剛得到了這個代碼,爲我的菜單的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"); 

回答

0

爲了做到這一點,您需要使用遞歸函數來處理數組 - >列表轉換。

下面是一個例子:

<?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'成更適合你的情況的東西。 –