PHP树菜单,自下而上

时间:2013-04-22 11:12:28

标签: php menu bottom-up

我在使用自下而上的树状菜单时遇到了一些问题。 我已经有一个从上到下工作的脚本,工作正常。

这是我表格的简化版本:

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

2 个答案:

答案 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;
    }
}
?>