2009-10-06 62 views
0

我需要用MySQL數據庫創建一個帶有PHP的菜單。如何使用PHP創建一個嵌套的MySQL菜單?

表稱爲類具有ID,姓名,PARENT_ID,shortdesc等

輸出需要有partent列表下父列表和兒童名單如下。

如果你能告訴我的代碼或網站,我將不勝感激。

<ul id="catmenu"> 
    <li class="menulist">Cars 
     <ul> 
      <li>Ford</li> 
      <li>Honda</li> 
      <li>Toyota</li> 
     </ul> 
    </li> 
    <li class="menulist">Food 
     <ul> 
      <li>Pasta</li> 
      <li>Pizza</li> 
      ... 
     </ul> 
    </li> 
... 
... 
</ul> 
+2

列表只有2個級別,還是可以是N級? – 2009-10-06 11:13:37

回答

1

這是專門爲兩個級別深。推薦的方法應該更多的是使用優化的表結構進行遍歷,如http://articles.sitepoint.com/article/hierarchical-data-database/2(在其他地方指出),或者將需要的數據提取到字典(關聯數組)中,並以此方式查詢它。

<?php 
    $query = <<<EOT 
     SELECT 
      parent.name as parent_name, 
      child.name as child_name, 
     FROM 
      items child 
     INNER JOIN 
      items parent 
     ON 
      child.parent_id = parent.id 
     ORDER BY 
      parent.name 
EOT; 

    $result = mysql_query($query) or die('Failure!'); 

    echo "<ul id=\"catmenu\">"; 

    $last_parent = ''; 
    while($row = mysql_fetch_array($result)){ 
     // If this is a new category, start a new one 
     if($last_parent != $row['parent_name']){ 
      // Unless this is the first item, close the last category 
      if($last_parent != ''){ 
       echo "</ul></li>"; 
      } 
      $last_parent = $row['parent_name']; 
      echo "<li class=\"menulist\">{$row['parent_name']}<ul>"; 
     } 
     echo "<li>{$row['child_name']}</li>"; 
    } 

    // If we actually had items, close the "category" 
    if($last_parent != ''){ 
     echo "</ul></li>"; 
    } 

    echo "</ul>"; 

?> 
1

如果只有兩個層次,然後,你可以只顯示它們:

echo '<ul id="catmenu">'; 
foreach($menu as $element) { 


    echo '<li><ul class="menulist">'; 
    foreach($element['submenu'] as $submenu) { 

     echo '<li>' . $submenu['name'] . '</li>'; 
    } 
    echo '</ul></li>'; 
} 
echo '</ul> 

如果您有子菜單中的不確定數不過你應該使用Recursive Function

function menu($item) { 
    $ret = '<li>' . $item['name']; 

    if (!empty($item['submenu'])) { 
     foreach($item['submenu'] as $submenu) { 
      $ret .= menu($submenu); 
     } 
    } 
    return $ret; 
} 
echo menu($menu); 

因此,您的每個子類別,無論其編號是什麼都會顯示。

1

您可以像這樣製作數據庫。

ID NAME  PARENT 
0  Cars  -1 
1  Foods -1 
2  Ford  0 
3  Honda  0 
4  Toyota 0 
5  Pasta  1 
6  Pizza  1 
... 

您將它們全部查詢並將其放入數組中。

$Menus = array(); 
// In a read MySQL loop 
$Menus[$i]['ID'] 
$Menus[$i]['NAME'] 
$Menus[$i]['PARENT'] 
// Sorry, lazy to write. I think you know what I mean. 

然後你循環所有的菜單尋找父母== -1。生成所有UL和IL,然後用另一個嵌套菜單進行分割。 你可以簡單地創建一個像這樣的函數。

var $MenuLevelClass = array("menulist"); 
  
function CreateMenu($Menus, $Tab = 0, $Parent = -1, $Level = 0) { 
    global $MenuLevelClass; 
      
    $CatClass = ($Level != 0) ? '' : ' class="catmenu"'; 
    $MenuClass = $MenuLevelClass[$Level]; 
    if ($MenuClass != '') 
     $MenuClass = ' class="'.$MenuClass.'"'; 
      
    $TabCount = $Level + $Tab; 
    $TabUL = ""; 
    for ($t = 0; $t < $TabCount; $t++) 
     $TabUL = $TabUL."\t"; 
    $TabLI = $TabUL."\t"; 
      
?> 
<?=$TabUL?><ul<?=$CatClass?>> 
<?php 
      
    $MenuCount = count($Menus); 
    for ($m = 0; $m < $MenuCount; $m++) { 
     $Menu = $Menu[$m]; 
     $ID = $Menu['ID']; 
     if ($ID != $Parent) 
      continue; 
      
?> 
<?=$TabLI?><li<?=$MenuClass?>><?=$Menu['Name']?><?=CreateMenu($Menus, $Tab + 1, $ID, $Level + 1)?></li> 
<?php 
      
?> 
<?=$TabUL?></ul> 
<?php 
      
    } 
} 

,並使用它只是運行 'CreateMenu($Menus);' 或 'CreateMenu($Menus, $PrefixTabCount);'。 CreateMenu將遞歸地爲您創建嵌套菜單。

我還沒有測試,所以你可能需要調整它。

希望這會有所幫助。