我已经经历了数十个和几十个类似的问题,但实际上并没有解决我的具体要求。
我有一个由三个变量(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">
?
任何帮助都将非常感激。
答案 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);
}
修改强>
我已经回答了我自己的问题,我不知道这是否对你有帮助,但这是我的新功能。