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

PHP 遞歸遍歷多維陣列的三種實用方法

     編輯:PHP 綜合知識

應用場景

處理表單巢狀資料、解析 JSON/API 回應、建立樹狀選單、深度搜尋特定鍵值等,皆需遍歷多維陣列。

方法一:遞歸函式(經典寫法)

<?php
function walkArrayRecursive(array $array, callable $callback, string $path = ''): void
{
    foreach ($array as $key => $value) {
        $currentPath = $path ? "$path[$key]" : "[$key]";
        if (is_array($value)) {
            walkArrayRecursive($value, $callback, $currentPath);
        } else {
            $callback($currentPath, $value);
        }
    }
}

// 使用範例
$data = [
    'user' => ['name' => 'Alice', 'age' => 28],
    'settings' => ['theme' => 'dark', 'lang' => 'zh-TW'],
];

walkArrayRecursive($data, function (string $path, $value) {
    echo "$path = $value\n";
});
/*
[user][name] = Alice
[user][age] = 28
[settings][theme] = dark
[settings][lang] = zh-TW
*/

方法二:RecursiveIteratorIterator(SPL 標準庫,效能更佳)

<?php
$data = [
    'a' => [1, 2, ['x', 'y']],
    'b' => 3,
];

$iterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator($data),
    RecursiveIteratorIterator::SELF_FIRST // 先處理父層再處理子層
);

foreach ($iterator as $key => $value) {
    $depth = $iterator->getDepth();
    $path = implode('][', array_map(fn($k) => "[$k]", iterator_to_array(new RecursiveTreeIterator($iterator, RecursiveTreeIterator::BYPASS_CURRENT))));
    // 簡化:直接輸出鍵值與深度
    echo str_repeat('  ', $depth) . "[$key] => $value\n";
}

方法三:生成器(記憶體友善,適合超大陣列)

<?php
function flattenArray(array $array): Generator
{
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            yield from flattenArray($value);
        } else {
            yield $key => $value;
        }
    }
}

foreach (flattenArray($hugeArray) as $key => $value) {
    // 逐一處理,不一次載入所有鍵值到記憶體
    process($key, $value);
}

常見需求:搜尋特定鍵、扁平化、鍵值轉換

// 搜尋所有 'email' 鍵
function findKey(array $array, string $targetKey): array
{
    $results = [];
    walkArrayRecursive($array, function ($path, $value) use ($targetKey, &$results) {
        if (basename($path) === "[$targetKey]") {
            $results[$path] = $value;
        }
    });
    return $results;
}

// 扁平化為單層陣列(鍵名以點號串接)
function flattenToDotNotation(array $array, string $prefix = ''): array
{
    $result = [];
    foreach ($array as $key => $value) {
        $newKey = $prefix ? "$prefix.$key" : $key;
        if (is_array($value)) {
            $result += flattenToDotNotation($value, $newKey);
        } else {
            $result[$newKey] = $value;
        }
    }
    return $result;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved