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

如何实现将PHP层级数组递归格式化为指定HTML结构?

解决PHP层级数组递归转换为指定HTML结构的问题

看起来你在处理PHP层级数组转HTML的递归逻辑时卡壳了——尤其是标签的打开/闭合时机对吧?我帮你整理了一个靠谱的递归实现,完全适配你说的数组结构(子节点存在c字段,叶子节点无c)。

先对齐下基础信息(如果和你的实际场景有出入,直接调整对应的字段/标签即可)

示例层级数组(对应你提到的结构)

$hierarchy = [
    [
        'name' => 'LOCATION',
        'c' => [
            ['name' => 'DELIVERY POINT'],
            [
                'name' => 'PORT',
                'c' => [
                    ['name' => 'SEA PORT'],
                    ['name' => 'AIR PORT']
                ]
            ]
        ]
    ],
    ['name' => 'PRODUCT']
];

目标HTML结构示例

<ul>
    <li>LOCATION
        <ul>
            <li>DELIVERY POINT</li>
            <li>PORT
                <ul>
                    <li>SEA PORT</li>
                    <li>AIR PORT</li>
                </ul>
            </li>
        </ul>
    </li>
    <li>PRODUCT</li>
</ul>

核心递归转换函数实现

这个函数的关键是严格控制标签的进入(打开)和退出(关闭)时机:遍历节点时先开<li>,有子节点就递归生成子<ul>,子节点处理完再关<li>,完全符合嵌套逻辑。

function hierarchyToHtml($hierarchy) {
    // 空数组直接返回,避免生成无效空标签
    if (empty($hierarchy)) {
        return '';
    }
    
    $html = '<ul>';
    
    foreach ($hierarchy as $node) {
        // 打开当前节点的li,转义内容防XSS
        $html .= '<li>' . htmlspecialchars($node['name']);
        
        // 如果当前节点有子节点(存在c字段且非空),递归处理
        if (isset($node['c']) && !empty($node['c'])) {
            $html .= hierarchyToHtml($node['c']);
        }
        
        // 必须等子节点处理完,再关闭当前li
        $html .= '</li>';
    }
    
    $html .= '</ul>';
    
    return $html;
}

怎么用?

直接把你的get_entity_hierarchy()生成的数组传进去就行:

// 假设你的层级数组由这个函数生成
$entityHierarchy = get_entity_hierarchy();
// 输出转换后的HTML
echo hierarchyToHtml($entityHierarchy);

关键逻辑拆解

  1. 空值判断:先检查传入的数组是否为空,避免生成没用的<ul></ul>空标签。
  2. 标签嵌套顺序:
    • 先开<li>写节点名,这是进入当前节点的第一步;
    • 发现有子节点c时,递归调用函数——递归会自动生成子节点的完整<ul>结构;
    • 子节点处理完毕后,再关闭当前的<li>,确保标签嵌套完全正确,不会出现提前闭合或漏闭合的问题。
  3. 安全防护:用htmlspecialchars()转义节点名称,防止数据库里的特殊字符破坏HTML结构,同时避免XSS风险。

如果你的实际数组字段不是name,或者目标HTML需要用<ol>代替<ul>,只需要修改对应的字段名或标签即可,核心递归逻辑完全通用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:48:15