2013-04-18 131 views
-1

我有這樣的JavaScript代碼,讓我來創建子菜單水平菜單,如下所示:動態生成水平菜單

<ul id="menu"> 
<li>Menu 1 
    <ul> 
    <li>Sub Menu 1</li> 
    </ul> 
</li> 
</ul> 

,因爲我想我可以創建任意多個子菜單,可問題是我使用PHP獲取來自MySQL數據庫的鏈接,不知道如何動態構建這些子菜單,而無需一次又一次手動檢查子菜單。例如,在MySQL表:

領域: Menu_ID 菜單名 Menu_Link Menu_ParentID

所以菜單ID僅僅是一個自動遞增和menu_parentid讓我指定一個子菜單名稱/鏈接到一個父菜單。但是,爲了做到這一點我現在做這個2子菜單中檢查:

$query = "SELECT * FROM site_menu WHERE Menu_ParentID = 0"; 

foreach($query AS $q) 
{ 
//run through the results 
$query2 = "SELECT * FROM site_menu WHERE Menu_ParentID = $q['id']"; 

foreach($query2 AS $q2) 
{ 
//run through the results 
} 
} 

正如你可以看到我有查詢兩次,得到的只是第一子菜單,如果有什麼第三子菜單?我必須運行3個查詢嗎?有什麼建議麼?

回答

1

也許一個函數或do..while循環可能是爲了?概念證明:

function menuQuery($id) 
{ 
    $query = "SELECT * FROM site_menu WHERE Menu_ParentID = $id"; 

    if ($query) { 
     foreach($query AS $q) { 
      //run through the results 
      menuQuery($q->id); 
     } 
    } 
} 

//initial call of top level menu items 
menuQuery(0); 
0

我建議在你的菜單表中放置一個排序或順序列。然後,您可以使用排序欄來撤回所有結果。這樣可以讓您使用子菜單項的頂層菜單順序排列。

通過這種方式,您可以創建數據庫結果的一個循環,並根據是否填充parent_id來選擇要編寫的菜單部分。

0
  1. 編寫一個查詢,通過在某時刻查詢一行Menu_ParentID
  2. 過程有序。您將從根開始,因爲它的ID爲0.對於每一行,循環遍歷所有其他行並查找該行的子項,即那些行的父id等於您正在處理的行的id。使用此過程建立一個數據結構,像這樣:

    [ Root Item 1, [Child1, Child2, [SubChild1, SubChild2], Child3], Root Item 2, ...] 
    
  3. 寫一個輔助函數,像這樣(未經):

    function displayItem($item) { 
        if (is_array($item)) { 
        $html = '<li><ul>'; 
        foreach ($item as $subitem) $html .= displayItem($subItem); 
        $html .= '</ul></li>'; 
        return $html; 
        } 
        else return '<li>' . $item . '</li>'; 
    } 
    
  4. 遍歷你在2中創建的結構,要求displayItem爲每個元素

0

這裏是一個運行只是一次在數據庫上,並只使用它帶來的分層陣列的簡單遞歸函數的例子。

# table 
CREATE TABLE foo (
    menu_id int not null auto_increment primary key, 
    menu_name varchar(255) not null, 
    menu_link varchar(255) not null default '#', 
    menu_parent_id int not null default 0 
); 

# data 
INSERT INTO `test`.`foo` 
    (`menu_id`,`menu_name`,`menu_link`,`menu_parent_id`) 
VALUES 
    (1, 'Catalog', '#', 0), 
    (2, 'Reports', '#', 0), 
    (3, 'Products', '#', 1), 
    (4, 'Sales', '#', 2), 
    (5, 'Customers', '#', 2), 
    (6, 'Tvs', '#', 3); 

這裏是你的PHP代碼:

<?php 
$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '****'); 

$stmt = $db->query("SELECT * FROM foo"); 
$resultSet = $stmt->fetchAll(PDO::FETCH_ASSOC); 


$setMenu = function ($data, $index = 0) use (&$setMenu){ 
       $menu = array(); 

     foreach ($data as $row) { 
      if ((int) $row['menu_parent_id'] !== $index) 
       continue; 

      $menu[$row['menu_id']] = array(
       'name' => $row['menu_name'], 
       'link' => $row['menu_link'], 
       'submenus' => $setMenu($data, (int) $row['menu_id']), 
      ); 
     } 

     return $menu; 
}; 

// your menu 
$menu = $setMenu($resultSet, 0); 

var_export($menu); 

它要給你準備在你的列表(UL)去的信息。

乾杯!

0
$data=array(
array('Menu_ID'=>1, 'Menu_Name'=>'Catalog', 'Menu_Link'=>'#', 'Menu_ParentID'=>0), 
array('Menu_ID'=>2, 'Menu_Name'=>'Reports', 'Menu_Link'=>'#', 'Menu_ParentID'=>0), 
array('Menu_ID'=>3, 'Menu_Name'=>'Products','Menu_Link'=> '#','Menu_ParentID'=> 1), 
array('Menu_ID'=>4, 'Menu_Name'=>'Sales','Menu_Link'=> '#', 'Menu_ParentID'=>2), 
array('Menu_ID'=>5, 'Menu_Name'=>'Customers','Menu_Link'=> '#', 'Menu_ParentID'=>2), 
array('Menu_ID'=>6, 'Menu_Name'=>'Tvs','Menu_Link'=> '#','Menu_ParentID'=> 3)); 

print_r(loop_menu($data)); 

// Menu_ID Menu_Name Menu_Link Menu_ParentID 
function loop_menu($rows,$parent = 0){ 
$arr=array(); 
$i=0; 
    foreach ($rows as $row) 
    { 
     if (array_key_exists('Menu_ParentID',$row) && $row['Menu_ParentID'] == $parent){ 

       if(array_key_exists($i,$arr)){ 
        $arr[$i]=array(); 
       } 
       $arr[$i]['data']=$row; 
       $arr[$i]['child']= loop_menu($rows,$row['Menu_ID']); 
       $i++; 
     } 
    } 
    return $arr; 
} 

然後

Array 
(
    [0] => Array 
     (
      [data] => Array 
       (
        [Menu_ID] => 1 
        [Menu_Name] => Catalog 
        [Menu_Link] => # 
        [Menu_ParentID] => 0 
       ) 

      [child] => Array 
       (
        [0] => Array 
         (
          [data] => Array 
           (
            [Menu_ID] => 3 
            [Menu_Name] => Products 
            [Menu_Link] => # 
            [Menu_ParentID] => 1 
           ) 

          [child] => Array 
           (
            [0] => Array 
             (
              [data] => Array 
               (
                [Menu_ID] => 6 
                [Menu_Name] => Tvs 
                [Menu_Link] => # 
                [Menu_ParentID] => 3 
               ) 

              [child] => Array 
               (
               ) 

             ) 

           ) 

         ) 

       ) 

     ) 

    [1] => Array 
     (
      [data] => Array 
       (
        [Menu_ID] => 2 
        [Menu_Name] => Reports 
        [Menu_Link] => # 
        [Menu_ParentID] => 0 
       ) 

      [child] => Array 
       (
        [0] => Array 
         (
          [data] => Array 
           (
            [Menu_ID] => 4 
            [Menu_Name] => Sales 
            [Menu_Link] => # 
            [Menu_ParentID] => 2 
           ) 

          [child] => Array 
           (
           ) 

         ) 

        [1] => Array 
         (
          [data] => Array 
           (
            [Menu_ID] => 5 
            [Menu_Name] => Customers 
            [Menu_Link] => # 
            [Menu_ParentID] => 2 
           ) 

          [child] => Array 
           (
           ) 

         ) 

       ) 

     ) 

) 

然後代碼類似陣列UL

http://sandbox.onlinephpfunctions.com/code/2b3ab04f959413ebf75b65034edd60da61ed0020

更新

另一個數組風格

$arr[$i]['data'] = $row; 
$arr[$i]['child']= loop_menu($rows,$row['Menu_ID']); 

變化

$row['child'] = loop_menu($rows,$row['Menu_ID']); 
$arr[$i] = $row; 

得到