如果您的树将具有无限级别,您将需要使用递归,并且如果您将在树中有很多项目,您需要在构建和渲染树时考虑内存使用情况。
记住这一点,我最近用以下模式解决了一个类似的问题:加载树,然后渲染树。
从 render() 方法开始,您将加载树的所有数据。您将从父节点开始并获取父节点。get_children() 有一个递归选项来获取孩子的孩子。加载数据后,然后渲染数据。从渲染顶级节点开始,然后递归地渲染子节点和子节点的子节点。
您需要填写这些部分才能真正从数据源中获取数据,但这是一个开始:
<?php
class Tree
{
var $tree = array();
function render()
{
$this->tree = $this->load();
$html = ''; // use your favorite templating system to generate the html
foreach ($this->tree as $parent_node)
{
$html .= $this->render_node($parent_node);
}
return $html;
}
function render_node($parent_node,$recursive=true)
{
// use your favorite templating system to generate the html
$html = '<ul><li>' . $parent_node->name;
$html .= '<ul>';
foreach ($parent_node->children as $child)
{
$html .= '<li>' . $child->name;
if ($recursive === true)
{
$html .= $this->render_node($child,$recursive);
}
$html .= '</li>';
}
$html .= '</ul>';
$html .= '</li></ul>';
return $html;
}
function load_tree()
{
$parents = $this->get_tree_parents();
foreach ($parents as $parent)
{
$parent->children = $this->get_children($parent);
}
$this->tree = $parents;
}
function get_tree_parents()
{
// find all top level nodes in the tree
return $parent_nodes;
}
function get_children($parent,$recursive=true)
{
// find all child nodes of the $parent
$children = array(/*...*/);
if ($recursive === true)
{
foreach ($children as $child)
{
$child->children = $this->get_children($child,$recursive);
}
}
return $children;
}
}
要运行这样的东西,你只需要:
<?php
$tree = new Tree();
echo $tree->render();
根据您的特定用例,您可以进行各种优化。如果您有一棵巨大的树,您可能需要使用 ajax 仅根据需要在客户端上加载数据。您可以根据要求将参数添加到数据和渲染方法以加载到树的特定分支上。