使用php和mysql为嵌套菜单生成链接

时间:2012-10-12 18:31:52

标签: php mysql menu nested-lists

我已经经历了数十个和几十个类似的问题,但实际上并没有解决我的具体要求。

我有一个由三个变量(id,name,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();

我的问题是我如何生成链接,以便以“漂亮的网址”方式呈现。 恩。 <a href="/parent_category/sub_category/sub_sub_category">? 任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:1)

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

我的数据库表按以下方式构建:

id | pid |标题|网址
--------------------------------
1 | 0 |主页|家
2 | 0 |家长|父
3 | 2 |子母|亚父
4 | 3 |子父子|子父子

我希望“Sub Parent Child”的链接网址显示为:/ parent / sub-parent / 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); 
}

修改
我已经回答了我自己的问题,我不知道这是否对你有帮助,但这是我的新功能。