You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP递归函数实现分类数据的嵌套UL列表输出需求

递归渲染树形分类为嵌套HTML列表

我已经通过以下PHP递归函数从数据库获取了以parent_id=0为起点的树形分类数据:

public function get_categories($table_name, $parent_id = 0)
{
    $this->db->where('`parent`', $parent_id); // 修正原代码变量名错误,原代码使用了未定义的$parent
    $parent = $this->db->get($table_name);
    $categories = $parent->result();

    $i = 0;
    foreach ($categories as $p_cat) {
        $categories[$i]->sub = $this->sub_categories($table_name, $p_cat->id);
        $i++;
    }
    return $categories;
}

public function sub_categories($table_name, $id)
{
    $this->db->where('`parent`', $id);
    $child = $this->db->get($table_name);
    $categories = $child->result();
    $i = 0;
    foreach ($categories as $p_cat) {
        $categories[$i]->sub = $this->sub_categories($table_name, $p_cat->id);
        $i++;
    }
    return $categories;
}

获取到的$categories数据结构示例:

Array ( 
    [0] => stdClass Object ( 
            [id] => 1 
            [name] => XMLELEMENT10 
            [parent] => 0 
            [sub] => Array ( 
                [0] => stdClass Object ( 
                    [id] => 13 
                    [name] => XMLELEMENT113 
                    [parent] => 1 
                    [sub] => Array ( ) 
                ) 
                [1] => stdClass Object ( 
                    [id] => 14 
                    [name] => XMLELEMENT114 
                    [parent] => 1 
                    [sub] => Array ( ) 
                ) 
                [2] => stdClass Object ( 
                    [id] => 15 
                    [name] => XMLELEMENT115
                    [parent] => 1 
                    [sub] => Array ( ) ) 
                [3] => stdClass Object ( 
                    [id] => 16 
                    [name] => XMLELEMENT116 
                    [parent] => 1 
                    [sub] => Array ( ) 
                ) 
            ) 
        ) 
    [1] => stdClass Object ( 
            [id] => 2 
            [name] => XMLELEMENT20 
            [parent] => 0 
            [sub] => Array ( 
                [0] => stdClass Object ( 
                    [id] => 5 
                    [name] => XMLELEMENT52 
                    [parent] => 2 
                    [sub] => Array ( ) 
                ) 
            ) 
        ) 
    // 其余数据省略...
)

现在需要将这些数据渲染成嵌套的HTML列表结构,以下是实现该功能的递归函数:

function renderCategories($categories) {
    // 分类数组为空时直接返回空字符串
    if (empty($categories)) {
        return '';
    }

    $html = '<ul>';
    foreach ($categories as $category) {
        // 转义分类名称,避免XSS攻击和HTML字符冲突
        $html .= '<li>' . htmlspecialchars($category->name);
        // 递归渲染子分类
        $html .= renderCategories($category->sub);
        $html .= '</li>';
    }
    $html .= '</ul>';

    return $html;
}

使用方法

获取到分类数据后,直接调用函数生成并输出HTML:

// 假设已通过get_categories获取到$categories数据
$categoryHtml = renderCategories($categories);
echo $categoryHtml;

函数会自动判断当前分类是否包含子分类,有子分类则递归生成嵌套列表,无则直接闭合<li>标签。

内容的提问来源于stack exchange,提问作者zkanoca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:01:11