递归函数必须显式传递层级参数,避免全局或静态变量;数据需预处理为树形结构;HTML缩进用 或CSS white-space: pre;中文对齐用等宽字体或全角空格,并用mb_strlen计算长度。

递归函数里怎么传入当前层级参数
直接用全局变量或静态变量控制缩进,容易在多线程或并发请求下出错,也难复用。必须把层级作为函数参数显式传递,每次递归调用时 +1。
- 初始调用传
$level = 0,后续每深入一层就传$level + 1 - 别在函数内部用
static $level = 0自增——同一函数多次调用会污染状态 - 层级值只用于生成缩进,不参与业务逻辑判断,避免耦合
缩进用空格还是 ?HTML 中怎么安全渲染
前端显示缩进时,直接输出多个空格会被浏览器合并成一个。必须用 或 CSS white-space: pre,但后者要额外加样式,更稳妥的是服务端拼接 。
- 每层缩进建议用 2–4 个
,例如:str_repeat(' ', $level) - 如果返回 JSON 或 API 接口,就别拼 HTML 实体,改用字段如
"indent": 2,由前端决定渲染方式 - 用
htmlspecialchars()包裹分类名,防止 XSS;但是实体,别二次转义
数据库查出来的父子关系数据怎么组织成树
PHP 递归遍历的前提是数据已按“父ID → 子数组”结构组织好,不是拿着平铺的二维数组硬递归。否则每次都要 foreach 全表找子项,性能极差。
- 先用一次查询取出全部分类,再用 PHP 构建树形数组:
$tree[$pid][] = $row - 根节点通常
parent_id = 0或NULL,注意数据库字段类型和 PHP 比较(0 === NULL会 false) - 避免在递归函数里反复查库——那是 N+1 查询,100 个节点可能触发 100 次 SQL
为什么缩进后中文对齐乱?怎么修复
中文字符宽度约等于两个英文字符,用等宽空格缩进时,纯空格或 在非等宽字体下看起来错位。这不是 PHP 问题,是渲染层表现。
立即学习“PHP免费学习笔记(深入)”;
- 最简方案:CSS 强制等宽字体:
style="font-family: 'Courier New', monospace;" - 不改样式的话,用
str_pad()配合全角空格(Unicode U+3000),但需确保页面编码为 UTF-8 - 别用
strlen()计算中文长度——改用mb_strlen($name, 'UTF-8'),否则缩进计算会偏移
被模板引擎自动转义了。



















