Php 递归列表函数
我有一个对象列表,这些对象是具有“n”子对象的其他相同对象的父对象 为了列出家长名单,我已经设法做到这一点:Php 递归列表函数,php,mysql,object,Php,Mysql,Object,我有一个对象列表,这些对象是具有“n”子对象的其他相同对象的父对象 为了列出家长名单,我已经设法做到这一点: echo "<ol>"; foreach ($indicator_dimensions as $dimension) { if (empty($dimension->parent)) { echo "<li>"; echo
echo "<ol>";
foreach ($indicator_dimensions as $dimension) {
if (empty($dimension->parent)) {
echo "<li>";
echo $dimension->dimension;
$subdimensions = Indicator_dimension::find_by_sql("SELECT * FROM indicator_dimension where parent=".$dimension->id);
if (count($subdimensions) != 0) {
find_leaves($subdimensions);
}
echo "</li>";
}
}
echo "</ol>";
echo”“;
foreach($indicator\u维度为$dimension){
if(空($dimension->parent)){
回声“”;
echo$dimension->dimension;
$subdimensions=Indicator_dimension::按_sql查找_(“从指标_dimension中选择*,其中parent=“.$dimension->id”);
如果(计数($subdimensions)!=0){
查找叶子($subdimensions);
}
回声“ ”;
}
}
回声“;
要列出他们的孩子,我使用以下函数:
function find_leaves($dimensions){
echo "<ol>";
foreach ($dimensions as $dimension) {
echo "<li>";
echo $dimension->dimension;
if (!empty($dimension->parent)) {
$subdimensions = Indicator_dimension::find_by_sql("SELECT * FROM indicator_dimension where parent=".$dimension->id);
if (count($subdimensions) != 0) {
find_leaves($subdimensions);
}
}
echo "</li>";
}
echo "</ol>";
}
函数查找($dimensions){
回声“;
foreach($dimension作为$dimension){
回声“”;
echo$dimension->dimension;
如果(!空($dimension->parent)){
$subdimensions=Indicator_dimension::按_sql查找_(“从指标_dimension中选择*,其中parent=“.$dimension->id”);
如果(计数($subdimensions)!=0){
查找叶子($subdimensions);
}
}
回声“ ”;
}
回声“;
}
虽然它在工作,但它是丑陋的代码,我想重构,但还没有大脑
提前感谢任何增强提示 这看起来需要一个经典的树实现。它由具有n个子节点的节点组成。 我写了一个小的示例实现。我知道遍历不是很干净,但它满足了您的需要 我将所有的魔力都委托给ListRenderer的遍历方法。这将递归地挖掘当前遍历节点的子节点:
protected function traverse(Node $node) {
if($node->__toString()) $this->output .= '<li>'.$node.'</li>'; //echo current node
if($node->hasChildren()) {
$this->output .= '<ol>';
foreach($node->getChildren() as $child) {
$this->traverse($child); //repeat for children
}
$this->output .= '</ol>';
}
}
受保护的函数遍历(节点$Node){
如果($node->\uuuuToString())$this->output.=''.$node. ';//回显当前节点
如果($node->hasChildren()){
$this->output.='';
foreach($node->getChildren()作为$child){
$this->transverse($child);//对子对象重复此操作
}
$this->output.='';
}
}
请注意,根节点不回显根节点,因为其标签为空。因此,示例的结果输出为:
<ol>
<li>sub1</li>
<li>sub2</li>
<ol>
<li>sub a</li>
<li>sub b</li>
<li>sub c</li>
</ol>
<li>sub3</li>
</ol>
sub1
sub2
亚甲
次级b
分c
sub3
这正是你想要的
如果您想了解有关树遍历的更多信息,请参阅。首先,您应该了解在关系数据库(如或)中存储和检索树数据的更高效技术。