2015-12-05 53 views
0

我有一个数据库中的3个表,我想加入为了建立一个3级嵌套列表(这将用作菜单的一部分)。到目前为止,我已经计算出如何从下表中选择表中的数据。我想一些帮助生成菜单的第三级,在PHP部分:从数据库表建立一个php嵌套列表

SQL表:

page_list:的pageID(primary_key)PAGE_NAME PAGEURL
level2_menu :的generalID(primary_key)gener_name的pageID(foreign_key);
level3_menu:deepID使用(primary_key)的generalID(foreign_key)deep_title

<?php 
get_menu("SELECT page_list.pageID as pageID, page_list.page_name as page_name, page_list.pageURL as pageURL, level2_menu.GeneralID as GeneralID, level2_menu.gener_name as general_name, level3_menu.deepID as deepID, level3_menu.deep_title as deep_title 
      FROM page_list 
      LEFT OUTER JOIN level2_menu ON page_list.pageID = level2_menu.pageID 
      LEFT OUTER JOIN level3_menu ON level2_menu.GeneralID = level3_menu.generalID 
      UNION 
      SELECT page_list.pageID as pageID, page_list.page_name as page_name, page_list.pageURL as pageURL, level2_menu.GeneralID as GeneralID, level2_menu.gener_name as general_name, level3_menu.deepID as deepID, level3_menu.deep_title as deep_title 
      FROM page_list 
      RIGHT OUTER JOIN level2_menu ON page_list.pageID = level2_menu.pageID 
      RIGHT OUTER JOIN level3_menu ON level2_menu.GeneralID = level3_menu.generalID 
      ORDER BY pageID desc 
      "); 

?> 

这给出了以下SQL结果:http://sqlfiddle.com/#!9/927a0

+--------------------+------------+----------+-----------+---------------+--------+------------+ 
| pageID Ascending 1 | page_name | pageURL | GeneralID | general_name | deepID | deep_title | 
+--------------------+------------+----------+-----------+---------------+--------+------------+ 
|     7 | get quote | 0  | NULL  | NULL   | NULL | NULL  | 
|     4 | tjanster | info.php | 9   | Title   | NULL | NULL  | 
|     3 | products | info.php | 5   | Title 2  | 8  | Subtitle | 
+--------------------+------------+----------+-----------+---------------+--------+------------+ 

,以及获得用于数据级别1列表和级别2列表,使用:

function get_menu($sql) 
{ 
    include 'connect.php'; 
    $result = $conn->query($sql); 
    if ($result->num_rows > 0) 
     ; 
    $current_album = ""; 
    echo "<div id='menu'><div class='menu_pos'><ul class='main-navigation'>\n"; 
    while ($row = $result->fetch_assoc()) { 
     if ($current_album <> "" && $current_album <> $row['pageID']) 
      echo "</ul></li>"; 

     if ($current_album <> $row['pageID']) { 
      echo "<li id='qoute'><a href='#'>" . $row['page_name'] . "</a><ul>\n"; 
      $current_album = $row['pageID']; 
     } 

     if ($row['GeneralID'] == 'NULL') { 
      echo "bob"; 
     } else { 
      echo "<li><a href='#'>" . $row['general_name'] . "</a></li>\n"; 
     } 

    } 
    echo "</ul></div></div>"; 
} 

这导致The first menu example shown here这是一个2级的列表,但是我想要3级列表,如第二个菜单示例,显示在jsfiddle中。

+0

有人能帮我解答吗? – ChriChri

+0

添加大数据查询结果的数据样本 – Blag

+0

您可以在这里找到:http://jsfiddle.net/981f8bgs/,其中涵盖了可能生成的所有数据类型。 – ChriChri

回答

0

首先,这是一种艰难的做事方式。原始SQL/RAW HTML/RAW PHP。模板(例如树枝),数据库帮手(例如教条)可以发挥魔力。

但是,为了回答你的问题 - 这可能工作

第一:我会在SQL

修改建议
SELECT 
page_list.pageID as pageID, page_list.page_name as page_name, page_list.pageURL as pageURL, 
level2_menu.GeneralID as GeneralID, level2_menu.gener_name as general_name, 
level3_menu.deepID as deepID, level3_menu.deep_title as deep_title 
FROM page_list 
    LEFT OUTER JOIN level2_menu ON page_list.pageID = level2_menu.pageID 
    LEFT OUTER JOIN level3_menu ON level2_menu.GeneralID = level3_menu.generalID 
ORDER BY pageID DESC, GeneralID DESC, deepID DESC 

二:准备菜单和outputmenu的分裂。

function get_menu($sql) { 
// the final output is in $output 
// @var string $output 
$output = ""; 

include 'connect.php'; 
$result = $conn->query($sql); 
if ($result->num_rows > 0) { 
    // constructing the structure of menu 

    $current_album = null; 
    $current_general_id = null; 

    $menu = []; 
    while ($row = $result->fetch_assoc()) { 
     // checking if top level menu is already added 
     if (!array_key_exists($row['pageID'], $menu)) { 
      $menu[$row['pageID']] = [ 
       'id' => $row['pageID'], 
       'name' => $row['page_name'], 
       'url' => $row['pageURL'], 
       'children' => [] 
      ];     
     } 
     $currentTopMenu = $menu[$row['pageID']]; 

     // checking if second level is defined and already exists 
     if (!array_key_exists($row['GeneralID'], $currentTopMenu['children'])) { 
      $sLevel = [ 
       'id' => $row['GeneralID'], 
       'name' => $row['general_name'], 
       'url' => '', 
       'children' => [] 
      ];  
      $menu[$row['pageID']]['children'][$row['GeneralID']] = $sLevel; 
     } 
     $currentSecondMenu = $menu[$row['pageID']]['children'][$row['GeneralID']]; 

     // last level of menu 
     if ($row['deepID']) { 
      $menu[$row['pageID']]['children'][$row['GeneralID']]['children'][$row['deepID']] = [ 
       'id' => $row['deepID'], 
       'name' => $row['deep_title'], 
       'url' => '', 
       'children' => [] 
      ]; 
     } 
    } 

    // making an output -> should be moved to the template 
    $output .= "<div id='menu'><div class='menu_pos'><ul class='main-navigation'>\n"; 
    foreach ($menu as $menuTopItem) { 
     $output .= "<li class='first'><a href='" . $menuTopItem['url'] . "'>" . $menuTopItem['name'] . "</a><ul>\n"; 

     foreach ($menuTopItem['children'] as $secondMenuItem) { 
      $output .= "<li class='second'><a href='" . $secondMenuItem['url'] . "'>" . $secondMenuItem['name'] . "</a><ul>\n"; 
      foreach ($secondMenuItem['children'] as $thirdMenuItem) { 
       $output .= "<li class='third'><a href='" . $thirdMenuItem['url'] . "'>" . $thirdMenuItem['name'] . "</a></li>\n"; 
      } 
      $output .= "</ul></li>"; 
     } 

     $output .= "</ul></li>";    
    } 
    $output .= "</ul></div></div>"; 
} 

echo $output; 
// or 
return $output; 
}