Php 递归列表函数

Php 递归列表函数,php,mysql,object,Php,Mysql,Object,我有一个对象列表,这些对象是具有“n”子对象的其他相同对象的父对象 为了列出家长名单,我已经设法做到这一点: echo "<ol>"; foreach ($indicator_dimensions as $dimension) { if (empty($dimension->parent)) { echo "<li>"; echo

我有一个对象列表,这些对象是具有“n”子对象的其他相同对象的父对象

为了列出家长名单,我已经设法做到这一点:

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
  • 这正是你想要的



    如果您想了解有关树遍历的更多信息,请参阅。

    首先,您应该了解在关系数据库(如或)中存储和检索树数据的更高效技术。