Php 如何使用foreach循环关闭标记时遇到问题

Php 如何使用foreach循环关闭标记时遇到问题,php,arrays,codeigniter,recursion,foreach,Php,Arrays,Codeigniter,Recursion,Foreach,我正在通过数据库建立一个分类管理器。以下PHP生成我将粘贴到下面的代码: function generate_menu($parent, $menu_array, $result = NULL) { $has_childs = FALSE; foreach($menu_array as $key => $value): if ($value['parent'] == $parent): $result .= '<li id="

我正在通过数据库建立一个分类管理器。以下PHP生成我将粘贴到下面的代码:

function generate_menu($parent, $menu_array, $result = NULL)
{
    $has_childs = FALSE;

    foreach($menu_array as $key => $value):
        if ($value['parent'] == $parent):
            $result .= '<li id="list_'.$value['id'].'" class="item">';
            $result .= '<div class="item">' . $value['name'] . '</div>';

            if ($has_childs):
                $has_childs = FALSE;
                $result .= '<ol>';
            else:
                $has_childs = TRUE;
                $result .= '</li>';
            endif; 

            $result .= $this->generate_menu($key, $menu_array);
        endif;
    endforeach;

    return $result;
}

我已经想出了这个办法。我把事情弄得有点复杂

function generate_menu($parent, $menu_array, $result = NULL)
{       
    foreach($menu_array as $key => $value):
        if ($value['parent'] == $parent):
            $result .= '<li id="list_'.$value['id'].'" class="item">';
            $result .= '<div class="item">' . $value['name'] . '</div>';
            $result .= '<ol>';
            $result .= $this->generate_menu($key, $menu_array);
            $result .= '</li></ol>';
        endif;
    endforeach;

    return $result;
}

为了正确使用递归函数,值数组需要反映如下层次结构:

array(
[11] => "Real Estate",
[12] => array(
    [0] => "Home Improvements",
    [13] => "Interior",
    [14] => "Exterior"
    ),
[15] => "Exterior Subcat"
)
该函数现在可以遍历11,正常情况下添加一个列表项。在12时,它将遇到一个数组而不是一个字符串,使用gettype$value,因此它将不再添加一个列表项,而是再次调用自己——将刚找到的数组作为参数传递。这在理论上允许无限数量的级别

function make_menu($menu_array) {

    $result = "<ol>";

    foreach($menu_array as $k=>$v)
    {
        $result .= '<li id="list_'.$k.'" class="item">';

        if(gettype($v) == 'array')
        {
            $result .= '<div class="item">' . $v[0] . '</div>';
            unset($v[0]);
            $result .= make_menu($v);
        }
        elseif(gettype($v) == 'string')
        {
            $result .= '<div class="item">' . $v . '</div>';
        }

        $result .= '</li>';
    }
    $result .= "</ol>";
    return $result;
}

为什么要将$result作为参数传递给函数?你为什么要使用另一种语法?另外,数组是什么样子的?我不知道为什么我用$result这么做,但后来我把它移到了函数中。但这不是问题所在。我将在我的帖子后面附加数组,这也不是问题,不是问题,但它是解决方案的一部分。如果你想让我们了解你的问题,你需要告诉我们5件事:你想要什么?你试过什么?你在输入什么?你在期待什么?你得到了什么?你已经告诉我们其中的4个了,你不是说6个吗?那你为什么要用另一种语法呢?嘿,不,那真的是个旁注。另一种语法通常用于在PHP块之间打印大块HTML,以防止出现尴尬的情况。你的结束语li和ol需要是另一种方式:除此之外,只要你没有太多的数据要处理,并且不介意空的ol,我认为这是一个很好的解决方案。如果菜单数组变得非常大,那么在对每个项遍历整个数组一次时,可能会出现性能问题。
Array
(
    [11] => Array
        (
            [name] => Real Estate
            [parent] => 
            [id] => 11
        )

    [12] => Array
        (
            [name] => Home Improvements
            [parent] => 
            [id] => 12
        )

    [13] => Array
        (
            [name] => Interior
            [parent] => 12
            [id] => 13
        )

    [14] => Array
        (
            [name] => Exterior
            [parent] => 12
            [id] => 14
        )

    [15] => Array
        (
            [name] => Exterior Subcat
            [parent] => 
            [id] => 15
        )

)
function generate_menu($parent, $menu_array, $result = NULL)
{       
    foreach($menu_array as $key => $value):
        if ($value['parent'] == $parent):
            $result .= '<li id="list_'.$value['id'].'" class="item">';
            $result .= '<div class="item">' . $value['name'] . '</div>';
            $result .= '<ol>';
            $result .= $this->generate_menu($key, $menu_array);
            $result .= '</li></ol>';
        endif;
    endforeach;

    return $result;
}
array(
[11] => "Real Estate",
[12] => array(
    [0] => "Home Improvements",
    [13] => "Interior",
    [14] => "Exterior"
    ),
[15] => "Exterior Subcat"
)
function make_menu($menu_array) {

    $result = "<ol>";

    foreach($menu_array as $k=>$v)
    {
        $result .= '<li id="list_'.$k.'" class="item">';

        if(gettype($v) == 'array')
        {
            $result .= '<div class="item">' . $v[0] . '</div>';
            unset($v[0]);
            $result .= make_menu($v);
        }
        elseif(gettype($v) == 'string')
        {
            $result .= '<div class="item">' . $v . '</div>';
        }

        $result .= '</li>';
    }
    $result .= "</ol>";
    return $result;
}