動態產生的陣列結構不固定,需程式化判斷其維度 (深度)。
<?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
?>
<?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);
}
// 測試同上
?>
<?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
?>
[] 深度為 1 (一維空陣列)。推薦使用 方法一 getArrayDepth():程式碼短、邏輯清晰、效能佳、無副作用。若需更詳細結構分析 (列表/關聯混合、長度分布),可擴充 analyzeArrayStructure()。