使用邻接列表模型... php从存储在表中的数据创建无序列表树菜单

时间:2010-03-24 22:59:08

标签: php multidimensional-array adjacency-list html-lists

我需要创建一个“nth”子类别的树状菜单。我决定在我的表结构中使用邻接列表模型,因为我不会非常更新这个表,这似乎是我最容易实现的。

我想使用“ul”和“li”标签来设置输出样式...我已经有了一个css和jquery解决方案来进行样式设置。我的问题来自于从数据库中提取数据并使用PHP的递归函数来构建列表......列表是一个连接的字符串,它被解析以构建树。我真的很难让关闭的“ul”和“li”标签排列在他们需要的位置。

这是最好的方法吗?有没有其他更好的方法使用数组或类似的东西来做到这一点?您可以向我指出构建此类列表的“最佳实践”的任何示例将不胜感激。谢谢。

这是我的表结构:

portfolio_id(int),p_name(varchar),parent_portfolio_id(int) 以下是我希望数据在呈现时的样子:

<ul>
<li>Portfolio Name
    <ul>
        <li>Sub portfolio A
            <ul>
                <li>Sub portfolio A - 1</li>
                <li>Sub portfolio A - 2</li>
                <li>Sub portfolio A - 3</li>
            </ul>
        </li>
        <li>Sub portfolio B</li>
        <li>Sub portfolio C</li>
    </ul>
</li>
</ul>

这是当前的递归函数:

function portf($ndb, $portfolio_id, $space=1, $x="", $level=1) // cat id, space to add "_" degree of categoreis times, list of categories
{
    $sql = "SELECT portfolio_id, p_name, parent_portfolio_id FROM portfolio WHERE parent_portfolio_id = $portfolio_id ORDER BY p_name ASC;";
    $select = $ndb->get_results($sql, 0, ARRAY_A);
    if( !is_null($select) )
    {
        foreach($select as $data)
        {
            $x = $x . $data->portfolio_id . '_' . $data->parent_portfolio_id . '_' . $level . str_repeat('_', $space) . $data->p_name . '-'; 
            $x = $this->portf($ndb, $data->portfolio_id, ($space+1), $x, ($level+1) );  
        }
        return $x; 
    }
    else
    {
        return $x;
    }
}

1 个答案:

答案 0 :(得分:1)

我必须承认,你在那里的某些代码上丢失了我。怎么了$ space和str_repeat?

无论如何,这就是我要尝试的。

function portf($ndb, $portfolio_id, $level=1)
{
    $sql = "SELECT portfolio_id, p_name, parent_portfolio_id FROM portfolio WHERE parent_portfolio_id = $portfolio_id ORDER BY p_name ASC;";
    $select = $ndb->get_results($sql, 0, ARRAY_A);

    if( !is_null($select) )
    {
        $li = "";
        foreach($select as $data)
        {
            $sublist = portf($ndb, $data->portfolio_id, $level+1);
            $li .= "<li>{$data->p_name}{$sublist}</li>";
        }
        $ul = "<ul class=\"level_$level\">$li</ul>";
        return $ul;
    }
    else
    {
        return "";
    }
}