我在让树形菜单自下而上工作时遇到一些问题。我已经有一个脚本可以从上到下工作,效果很好。
这是我的表格的一个非常简化的版本:
+-----+-----------+--------------------+
| 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'];
}
}
}