1

我试图有一个菜单,其中父类别可以有尽可能多的子类别。子类别可以有尽可能多的子子类别等等......

例如:

  • 项目清单:
    • 清单 1
    • 清单 2
      • 清单 2 a
      • 清单 2 b
        • 清单 2 双

对此有何见解?

PS。使用 Codeigniter HMVC

目前我的工作是:

使用辅助函数...

我可以通过以下代码查看 2 级嵌套类别:

<ul>
    <?php foreach($results as $row){ ?>
    <li>
        <?php echo $row->cat_title; ?>
        <?php 
        $childs = get_child_cat_by_id($row->cat_id);
        if(!empty($childs)){ ?>

        <ul>
            <?php  
            foreach($childs as $child){ ?>
            <li><?php echo $child->cat_title; ?>  
                <?php 
                $sub_child = get_sub_childs($child->cat_id);
                if(!empty($sub_child)){ ?>
                <ul>
                    <?php  
                    foreach($sub_child as $children){ ?>
                    <li><?php echo $children->cat_title; ?>  </li>
                    <?php }?>
                </ul>
                <?php } ?>

            </li>
            <?php }?>
        </ul>
        <?php } ?>

    </li>
    <?php } ?>
</ul> 

此代码在视图中使用。我需要一个递归方法,以便不需要多次调用函数 get_child_cat_by_id 。

4

1 回答 1

1

我对您的问题的最佳解决方案是使用 ORM 支持分层数据,如Doctrine 2或带有嵌套集扩展的Rapid Data Mapper

但是更简单的解决方案是获取数据的嵌套数组(为此处理您的模型)并尝试类似:

//Make a list from an array 
function nestedArrayToList($array, $property)
{
    $output = '<ul>';

    foreach ($array as $key => $mixedValue) { 
        if (is_array($mixedValue)) {
            // Recursive step
            $output .= '<li>' . nestedArrayToList($mixedValue) . '</li>'; 
        } else {
            // Simply output the property
            $output .= '<li>' . $mixedValue->$property . '</li>'; 
        }
    } 

    $output .= '</ul>'; 

    return $output; 
}


nestedArrayToList($row)

我没有测试它,但想法就在这里。

于 2013-06-18T06:20:28.053 回答