1

我在让树形菜单自下而上工作时遇到一些问题。我已经有一个脚本可以从上到下工作,效果很好。

这是我的表格的一个非常简化的版本:

+-----+-----------+--------------------+
| 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'];
        }
    }
}
4

2 回答 2

1

在不阅读您的代码的情况下,您应该这样做:

1)获取当前页面,查看父ID。

2) 使用该父 ID 加载所有内容。

3) 使用当前父 ID 作为 ID 获取下一个父 ID。

4) 如果新的父 ID != 0,则转到第 2 步,传入新的父 ID。

听起来您只需要编辑脚本以包含具有给定 ID 作为其父 ID 的所有页面。

于 2013-04-22T11:16:07.903 回答
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;
    }
}
?>
于 2013-04-22T11:32:20.670 回答