PHP 陣列可任意巢狀,判斷維度需遞迴遍歷所有元素,記錄最大深度。
arrayLevel()<?php
/**
* 回傳陣列的維度(深度)
* @param array $arr 待檢測陣列
* @return int 最大維度,純標量回傳 0
*/
function arrayLevel($arr) {
$levels = [0]; // 收集所有分支深度
// 內部遞迴函式,使用引用傳遞 $levels 累積結果
$traverse = function($arr, &$levels, $level = 0) use (&$traverse) {
if (is_array($arr)) {
$level++;
$levels[] = $level;
foreach ($arr as $value) {
$traverse($value, $levels, $level);
}
}
};
$traverse($arr, $levels);
return max($levels);
}
// 測試案例
$arr1 = [1, 2, 3]; // 一維
$arr2 = [[1,2], [3,4]]; // 二維
$arr3 = [[[1]], [2, [3, [4]]]]; // 四維
echo arrayLevel($arr1); // 1
echo arrayLevel($arr2); // 2
echo arrayLevel($arr3); // 4
?>
$levels = [0],確保空陣列回傳 0。$level++ 並記錄當前深度。$levels。max($levels) 為整體維度。use (&$fn)。is_array() 皆回傳 true。// 利用 json_encode 深度限制(間接估算,不精確)
function arrayDepthJson($arr) {
$json = json_encode($arr);
$depth = 0; $max = 0;
for ($i = 0; $i < strlen($json); $i++) {
if ($json[$i] === '[') { $depth++; $max = max($max, $depth); }
elseif ($json[$i] === ']') { $depth--; }
}
return $max;
}
JSON 方案僅供參考,無法區分物件與陣列,且字串中含括號會誤判。遞迴遍歷法最準確。