給定任意多維數組,計算其最大嵌套層級。例如:
$arr = [
[ [1,3,4], [ [ [1,2,3] ] ] ],
[ [1,2], [1] ]
];
// 深度 = 5 (第 1 層外層 -> 第 2 層 -> 第 3 層 -> 第 4 層 -> 第 5 層 [1,2,3])
<?php
/**
* 計算多維數組最大深度
* @param array $array 輸入數組
* @return int 最大深度 (最淺為 1)
*/
function array_depth(array $array): int {
$maxDepth = 1; // 當前層級至少為 1
foreach ($array as $value) {
if (is_array($value)) {
$depth = array_depth($value) + 1; // 子數組深度 + 1
if ($depth > $maxDepth) {
$maxDepth = $depth;
}
}
}
return $maxDepth;
}
// 測試
$test = [
["11"],
[],
[ [ ["5","6"], "7", "8" ] ],
[ [ ["5","6"], "7", "8" ] ],
"9", "10"
];
echo array_depth($test); // 輸出: 4
function array_depth_iterative(array $array): int {
$iterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator($array),
RecursiveIteratorIterator::SELF_FIRST
);
$maxDepth = 0;
foreach ($iterator as $key => $value) {
$depth = $iterator->getDepth() + 1; // getDepth() 從 0 開始
if ($depth > $maxDepth) $maxDepth = $depth;
}
return $maxDepth ?: 1; // 空數組深度為 1
}
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 遞歸函數 | 代碼簡潔、易理解 | 極深數組可能棧溢出 | 一般業務數組 (深度 < 1000) |
| SPL 迭代器 | 無棧溢出風險、內置 C 實現快 | 語法稍複雜 | 超大/極深數組、高頻調用 |
function array_deepest_path(array $array): array {
$iterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator($array),
RecursiveIteratorIterator::CHILD_FIRST
);
$maxDepth = -1;
$path = [];
foreach ($iterator as $key => $value) {
if ($iterator->getDepth() > $maxDepth) {
$maxDepth = $iterator->getDepth();
$path = [];
for ($i = 0; $i <= $maxDepth; $i++) {
$path[] = $iterator->getSubIterator($i)->key();
}
}
}
return $path; // 返回最深鍵名路徑
}