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

PHP如何将仅含ol/li标签的HTML项目符号列表转换为多维数组

PHP实现仅含ol/li的HTML有序列表转多维数组

以下为可直接运行的实现方案,基于PHP默认自带的DOM扩展开发,无需安装第三方依赖,适配纯ol/li无其他标签的HTML结构,支持任意层级嵌套(包含你需要的4级缩进场景):

function htmlListToArray(string $html): array
{
    // 初始化DOM解析器,屏蔽HTML片段加载的默认警告
    $dom = new DOMDocument();
    libxml_use_internal_errors(true);
    // 显式指定编码避免中文乱码
    $dom->loadHTML('<?xml encoding="UTF-8">' . $html);
    libxml_clear_errors();

    // 递归解析节点逻辑
    $parseNode = function (DOMNode $node) use (&$parseNode) {
        $result = [];
        foreach ($node->childNodes as $child) {
            // 仅处理li标签
            if ($child->nodeName === 'li') {
                $liText = '';
                $children = [];
                // 拆分li内的文本内容和子级ol列表
                foreach ($child->childNodes as $liChild) {
                    if ($liChild->nodeName === '#text') {
                        $liText .= trim($liChild->nodeValue);
                    } elseif ($liChild->nodeName === 'ol') {
                        $children = $parseNode($liChild);
                    }
                }
                // 组装单条数据结构,可按需调整字段
                $item = ['text' => $liText];
                if (!empty($children)) {
                    $item['children'] = $children;
                }
                $result[] = $item;
            }
        }
        return $result;
    };

    // 从最外层ol开始解析
    $rootOl = $dom->getElementsByTagName('ol')->item(0);
    return $rootOl ? $parseNode($rootOl) : [];
}

调用示例

// 测试用的4级嵌套HTML列表
$testHtml = <<<HTML
<ol>
    <li>一级项目1
        <ol>
            <li>二级项目1-1
                <ol>
                    <li>三级项目1-1-1</li>
                    <li>三级项目1-1-2
                        <ol>
                            <li>四级项目1-1-2-1</li>
                            <li>四级项目1-1-2-2</li>
                        </ol>
                    </li>
                </ol>
            </li>
            <li>二级项目1-2</li>
        </ol>
    </li>
    <li>一级项目2</li>
</ol>
HTML;

// 执行转换
$result = htmlListToArray($testHtml);
// 打印输出结果
print_r($result);

调整说明

如果不需要text/children的固定键结构,可自行修改$item的组装逻辑:比如无子级时直接存文本、有子级时用当前文本作为键存储子数组即可,适配不同的业务数据格式要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:57:03