我在使用自下而上的树状菜单时遇到了一些问题。 我已经有一个从上到下工作的脚本,工作正常。
这是我表格的简化版本:
+-----+-----------+--------------------+
| uid | parent_id | page_address |
+-----+-----------+--------------------+
| 1 | 0 | index.php |
| 2 | 0 | login.php |
| 3 | 2 | dashboard.php |
| 4 | 3 | bookings.php |
| 5 | 3 | documents.php |
| 6 | 4 | changebookings.php |
| 7 | 4 | activities.php |
+-----+-----------+--------------------+
page_address字段是唯一的。
我可以找出用户当前所在的页面,例如changebookings.php
然后我想要一个菜单看起来像这样:
login.php
dashboard.php
bookings.php
changebookings.php
activities.php
documents.php
然而,到目前为止我最接近的是以下树:
login.php
bookings.php
changebookings.php
如您所见,我的脚本目前只返回实际的父级,而不是当前父级的链接列表。
对于那些感兴趣的人,我总共使用的脚本位于这篇文章的底部。
是否有更简单的方法可以根据需要获得自下而上的树? 非常感谢
菲尔
编辑: 我终于让代码工作了,对于偶然发现这篇文章的未来用户,我添加了以下功能:
$dataRows = $databaseQuery->fetchAll(); // Get all the tree menu records
$dataRows = $result->fetchAll(PDO::FETCH_ASSOC);
foreach($dataRows as $row)
{
if($row['link_address']==substr($_SERVER['PHP_SELF'], 1, strlen($_SERVER['PHP_SELF'])-1))
{
$startingId = $row['parent_id'];
}
}
$menuTree = $this->constructChildTree($dataRows, $startingId);
private function constructChildTree(array $rows, $parentId, $nesting = 0)
{
$menu = array();
if(!in_array($nesting, $this->nestingData))
{
$this->nestingData[] = $nesting;
}
foreach($rows as $row)
{
if($row['parent_id']==$parentId && $parentId!=0)
{
$menu[] = $row['link_address'];
$newParentId = $this->getNextParent($rows, $row['parent_id']);
$parentChildren = $this->constructChildTree($rows, $newParentId, ($nesting+1));
if(count($parentChildren)>0)
{
foreach($parentChildren as $menuItem)
{
$menu[] = 'NESTING' . $nesting . '::' . $menuItem;
}
}
}
}
return $menu;
}
private function getNextParent($rows, $parentId)
{
foreach($rows as $row)
{
if($row['uid']==$parentId)
{
return $row['parent_id'];
}
}
}
答案 0 :(得分:1)
如果没有阅读您的代码,您应该这样做:
1)获取当前页面,查看父ID。
2)使用该父ID加载所有内容。
3)使用当前的父ID作为ID获取下一个父ID。
4)如果新的父ID!= 0,请转到第2步,传递新的父ID。
听起来您只需要编辑脚本以包含具有给定ID的所有页面作为其父ID。
答案 1 :(得分:1)
<?PHP
$sql = "SELECT * FROM TABLE WHERE table parent_id=0";
$result = mysql_query($sql);
while($perant_menu = mysql_fetch_array($result))
{
echo display_child($perant_menu["uid"],$perant_menu["page_address"]);
}
// Recursive function
function display_child($parent_id,$name)
{
$sql= "SELECT * FROM table where parent_id = $parent_id";
$result = mysql_query($sql);
if(mysql_num_rows($result)>0)
{
while($menu = mysql_fetch_array($result))
{
echo display_child($menu["id"],$menu["page_address"]);
}
}
else
{
echo $name;
}
}
?>