首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 遞歸計算多維數組深度算法實現

     編輯:PHP 相關知識

問題定義

給定任意多維數組,計算其最大嵌套層級。例如:

$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

非遞歸替代方案 (SPL 迭代器)

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; // 返回最深鍵名路徑
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved