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

PHP 判斷陣列維度:一維、二維、多維陣列深度檢測函式

     編輯:PHP 相關知識

需求

動態產生的陣列結構不固定,需程式化判斷其維度 (深度)。

方法一:遞迴計算最大深度 (修正版)

<?php
/**
 * 取得陣列最大維度 (深度)
 * @param array $arr
 * @return int 維度 (純量/非陣列=0, 一維=1, 二維=2...)
 */
function getArrayDepth(array $arr): int {
    $maxDepth = 0;
    foreach ($arr as $value) {
        if (is_array($value)) {
            $depth = getArrayDepth($value);
            if ($depth > $maxDepth) $maxDepth = $depth;
        }
    }
    return $maxDepth + 1; // 當前層 + 子層最大深度
}

// 測試
$arr1 = ['a', 'b', 'c'];                    // 一維
$arr2 = [[1,2], [3,4]];                     // 二維
$arr3 = [[[1]], [2, [3, [4]]]];             // 四維
$arr4 = ['x' => 1, 'y' => ['z' => 2]];      // 二維 (關聯式)

echo getArrayDepth($arr1) . "<br>"; // 1
echo getArrayDepth($arr2) . "<br>"; // 2
echo getArrayDepth($arr3) . "<br>"; // 4
echo getArrayDepth($arr4) . "<br>"; // 2
?>

方法二:原文提供的 arrayLevel (修正語法錯誤)

<?php
function arrayLevel($arr) {
    $levels = [0]; // 收集所有深度
    
    function traverse($arr, &$levels, $level = 0) {
        if (is_array($arr)) {
            $level++;
            $levels[] = $level;
            foreach ($arr as $v) {
                traverse($v, $levels, $level);
            }
        }
    }
    
    traverse($arr, $levels);
    return max($levels);
}

// 測試同上
?>

方法三:原文 getmaxdim (類別方法改為函式)

<?php
function getMaxDim($vDim) {
    if (!is_array($vDim)) return 0;
    $max = 0;
    foreach ($vDim as $item) {
        $d = getMaxDim($item);
        if ($d > $max) $max = $d;
    }
    return $max + 1;
}

// 測試
$arr = ['yiyi'=>1212, 'haha'=>['heihei'=>[['a']], 'b']];
echo getMaxDim($arr); // 4
?>

效能比較與選擇建議

方法特點適用場景
getArrayDepth (方法一)程式碼最簡潔、無全域/靜態變數、尾端遞迴優化友善**通用首選**
arrayLevel (方法二)收集所有層級深度可進一步分析分布需深度統計分布
getMaxDim (方法三)邏輯清晰、無額外參數教學示範

進階:檢查是否為「純列表」或「純關聯」結構

<?php
function analyzeArrayStructure(array $arr): array {
    $result = [
        'depth' => 0,
        'is_list' => true,      // 所有層級鍵名皆為 0..n 連續整數
        'is_assoc' => false,    // 含字串鍵名
        'max_length' => 0,
    ];
    
    function check($arr, &$result, $depth = 0) {
        $depth++;
        if ($depth > $result['depth']) $result['depth'] = $depth;
        
        $keys = array_keys($arr);
        $result['max_length'] = max($result['max_length'], count($arr));
        
        // 判斷是否為列表
        if ($keys !== range(0, count($arr)-1)) {
            $result['is_list'] = false;
            $result['is_assoc'] = true;
        }
        
        foreach ($arr as $v) {
            if (is_array($v)) check($v, $result, $depth);
        }
    }
    
    check($arr, $result);
    return $result;
}

print_r(analyzeArrayStructure([[1,2], [3,4]]));      // depth=2, is_list=true
print_r(analyzeArrayStructure(['a'=>[1,2], 'b'=>3])); // depth=2, is_list=false, is_assoc=true
?>

注意事項

  • PHP 陣列本質是有序映射,**同一層級可同時包含整數與字串鍵**,「維度」定義以**最大巢狀深度**為準。
  • 空陣列 [] 深度為 1 (一維空陣列)。
  • 非陣列輸入 (純量、null、物件) 深度為 0。
  • 極深巢狀 (超過 xdebug.max_nesting_level 約 256) 會導致遞迴錯誤,需改用迭代堆疊實作。

總結

推薦使用 方法一 getArrayDepth():程式碼短、邏輯清晰、效能佳、無副作用。若需更詳細結構分析 (列表/關聯混合、長度分布),可擴充 analyzeArrayStructure()。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved