本文详解如何正确使用递归函数遍历任意深度的分类树,并生成符合语义、层级清晰的嵌套 `
- ` html 字符串,避免重复拼接、层级错乱与变量污染问题。
在构建电商、CMS 或导航菜单等需要展示多级分类(如“电子产品 → 手机 → 智能手机 → 国产旗舰”)的场景中,将扁平/嵌套数组结构转化为带层级关系的 HTML 列表是常见需求。此时,递归是最自然、最符合树形结构本质的解决方案——它无需预判最大深度(如 6 层),代码简洁且可读性强。相比迭代(如栈模拟)或数据库预排序(如闭包表),递归在 PHP 中实现直观、维护成本低,是中小型项目首选。
但递归易出错的关键在于:状态管理混乱。原代码中存在多个典型问题:
- ❌ 将 $listAllEntries 作为输入参数并持续累加,导致子调用时父级内容被重复拼入;
- ❌ 错误地将 $children[] = $listAllEntries 等操作混入循环体,造成数据污染;
- ❌ $i 层级计数器未隔离作用域,跨分支递归时值被意外覆盖;
- ❌ trim($listAllEntries, “Array”) 等临时补丁掩盖了逻辑缺陷。
✅ 正确做法是:让递归函数专注“生成当前层级的 HTML 片段”,不依赖外部变量累积结果。每个调用应独立返回其子树的完整 HTML 字符串,由上层负责拼接。
以下是优化后的专业实现: