2012-10-12 30 views
2

我已经经历了几十个和几十个类似的问题,但实际上并没有解决我的具体需求。使用php和mysql生成嵌套菜单的链接

我有一个由三个变量(ID,姓名,PID)

嵌套的菜单与下面的函数生成定义的MySQL表:

function get_categories($parent = '0') { 
    $html = '<ul id="menu">'; 
    $query = mysql_query("SELECT * FROM `categories` WHERE `pid` = '$parent'"); 
    while($row = mysql_fetch_assoc($query)) { 
     $current_id = $row['id']; 
     $html .= '<li><a href="">' . $row['name'] . '</a>'; 
     $has_sub = NULL; 
     $has_sub = mysql_num_rows(mysql_query("SELECT COUNT(`pid`) FROM `categories` WHERE `pid` = '$current_id'")); 
     if($has_sub) { 
      $html .= get_categories($current_id); 
     } 
     $html .= '</li>'; 
    } 
    $html .= '</ul>'; 
    return $html; 
} 
print get_categories(); 

我的问题是我怎么可能产生该链接以便以“漂亮的网址”方式呈现。 ex。 <a href="/parent_category/sub_category/sub_sub_category">? 任何帮助将非常感激。

+0

更好的是从数据库中的子项到父项的category_path – GBD

+0

我知道,但想知道是否有方法从父/子关系(从现有的表)生成该路径。 – elrayyes

回答

1

这是我目前的递归菜单功能,我遇到同样的问题。你有没有最终找到解决方案?

我的数据库表下面的方式构造:

ID | pid |标题| url
--------------------------------
1 | 0 |主页|家
2 | 0 |父| |父
3 | 2 | Sub Parent |子父
4 | 3 | Sub Parent Child |要显示子亲子

我想“子亲子”的链接网址为:/父/子的父/子亲子/

function buildMenu(){ 

// get all menuitems with 1 query 
$result = mysql_query("SELECT id, pid, url, title FROM links ORDER BY pid, title") 
or die(mysql_error()); 

// prepare special array with parent-child relations 
$menuData = array( 
    'items' => array(), 
    'parents' => array() 
); 

while ($menuItem = mysql_fetch_array($result)) 
{ 
    $menuData['items'][$menuItem['id']] = array(
     'id' => $menuItem['id'], 
     'pid' => $menuItem['pid'], 
     'url' => $menuItem['url'], 
     'title' => $menuItem['title'] 
    ); 

    $menuData['parents'][$menuItem['pid']][] = $menuItem['id']; 
} 

// menu builder function, parentId 0 is the root 
function buildList($parentId, $parentUrl, $menuData) 
{ 
    $html = ''; 

    if (isset($menuData['parents'][$parentId])) 
    { 
     $html = '<ul>'; 
     foreach ($menuData['parents'][$parentId] as $itemId) 
     { 
      $parent_url = $parentUrl."/".$menuData['items'][$itemId]['url']; 

      $html .= '<li><a href="'. $parent_url .'">' . $menuData['items'][$itemId]['title'] . '</a>'; 

      // find childitems recursively 
      $html .= buildList($itemId, $parent_url, $menuData); 

      $html .= '</li>'; 
     } 
     $html .= '</ul>'; 
    } 

    return $html; 
} 

// output the menu 
echo buildList(0, "", $menuData); 
} 

编辑
我已经回答了我自己的问题,我不知道这是否可以帮助您,但这是我的新功能。

+1

您的示例考虑到您在数据库中设置了URL,这不完全是我正在查找的内容。我想根据突出显示的分类/子分类构建链接。 (即,如果我突出显示的项目是子子类别,则链接将反映http://mysite.com/category/sub-category/sub-sub-category)。 – elrayyes