2013-04-18 90 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; 

得到