2012-10-18 4 views
0

이 코드는 내 메뉴의 2 단계에서 작동합니다. 하지만 무제한 수준으로 작동하기를 바랍니다. 여러분 중 어디서부터 시작해야할까요? 지금 데이터베이스에 더 많은 레벨을 입력하면 "Undefined index Linnk & Label Line 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

, 당신은 당신의 배열을 처리하기 위해 재귀 함수를 사용하는 것이 좋습니다. jsfiddle에서

<?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); 

출력 :

다음은 예입니다.

+0

의견을 보내 주셔서 감사합니다. 코드와 함께 어떻게 녹일 수 있습니까? :-) – simon

+0

당신은'ternary'를 당신의 상황에 더 적합한 것으로 다시 쓰길 원할 것입니다. –