php计算数组深度本质是找最深嵌套路径的层数,需递归遍历所有元素取子深度最大值加1;基础情况为非数组返回0,递归情况对每个子项调用自身并+1。

PHP 中计算数组深度,本质是找“最深嵌套层数”,不是数有多少层键,而是看某条路径从顶层到最内层叶子能钻多深。关键在递归逻辑必须有明确的终止条件和层级推进机制,否则容易陷入无限调用或返回错误值(比如永远是 1)。
核心思路:找最大嵌套路径
数组维度不是静态结构,而是动态路径长度。例如:[1, [2, [3]]] 是三维(1 → [2, [3]] → [3] → 3),
而 ['a' => [1], 'b' => [2, [3, [4]]]] 的最大深度是 4(b → [2, [3, [4]]] → [3, [4]] → [4] → 4)。
所以不能只看某一个分支,得遍历所有元素,对每个子数组递归求深度,再取最大值。
- 基础情况(base case):当前值不是数组 → 深度为 0(不往下走了)
- 递归情况(recursive case):当前值是数组 → 对它的每个元素调用自身,得到子深度,然后 +1(本层贡献)
- 最终结果 = 所有子项返回深度中的最大值 + 1(本层数)
标准递归实现(推荐)
以下函数可直接使用,兼容关联键、混合类型,且不会破坏原始结构:
function getArrayDepth($array) {
if (!is_array($array)) {
return 0;
}
$max = 0;
foreach ($array as $value) {
$depth = getArrayDepth($value);
if ($depth > $max) {
$max = $depth;
}
}
return $max + 1;
}
✅ 调用示例:
-
getArrayDepth([1, 2, 3])→ 返回 1 -
getArrayDepth([1, [2, [3]]])→ 返回 3 -
getArrayDepth(['user' => ['profile' => ['name' => 'A']], 'tags' => []])→ 返回 3
防坑要点(实际开发中高频出错)
很多初学者写的版本会出错,常见问题包括:
- 没写
if (!is_array($array)) return 0→ 递归遇到数字/字符串就报错 - 把
$max = 1写死在开头 → 导致空数组也返回 1,而空数组[]实际应算作 1 层(它本身是个数组),但若按“含非数组元素的最深路径”定义,空数组无子项,其深度就是 1;这点需根据业务统一口径 - 用
count($array) === 0判断终止 → 错!空数组仍是数组,应继续递归逻辑(只是循环不执行),但它的深度仍是 1 - 忘记加
+1→ 返回的是子层数,不是包含自身的总层数
替代方案:迭代法(适合超大或可疑结构)
递归虽简洁,但 PHP 默认栈深度有限(通常 100 层左右)。如果数组可能极深,或含循环引用风险,可用栈模拟:
function getArrayDepthIterative($array) {
if (!is_array($array)) return 0;
$stack = [[$array, 1]]; // [当前数组, 当前深度]
$maxDepth = 1;
while (!empty($stack)) {
[$arr, $depth] = array_pop($stack);
$maxDepth = max($maxDepth, $depth);
foreach ($arr as $value) {
if (is_array($value)) {
$stack[] = [$value, $depth + 1];
}
}
}
return $maxDepth;
}
这个版本不依赖函数调用栈,可控性强,调试也方便,适合生产环境对稳定性要求高的场景。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











