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

PHP 遍歷多維陣列兩大核心方法:遞迴函數與雙層 foreach 實戰比較

     編輯:PHP 相關知識

PHP 遍歷多維陣列實戰:雙層 foreach vs 遞迴函數完整比較

處理多維陣列是高頻需求。本文展示兩種核心寫法:釐清已知結構用雙層 foreach、結構不定深度用遞迴函數。

測試資料結構

<?php
$a = [
    'fruits'  => ['a' => 'orange', 'b' => 'grape', 'c' => 'apple'],
    'numbers' => [1, 2, 3, 4, 5, 6],
    'holes'   => ['first', 5 => 'second', 'third'],
];

方法一:雙層 foreach(已知固定二維結構)

<?php
foreach ($a as $listKey => $things) {
    if (is_array($things)) {
        foreach ($things as $newKey => $value) {
            echo "key: $newKey
value: $value
"; } } }
  • 優點:直觀、效能最好、程式碼簡短
  • 缺點:只能處理固定二維,無法應對更深層巢狀
  • 適用:API 回傳固定結構、設定檔解析等

方法二:遞迴函數扁平化(不定深度、任意結構)

<?php
function flattenArray($array, &$result = []) {
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            flattenArray($value, $result);
        } else {
            $result[] = $value;
        }
    }
    return $result;
}

$flat = flattenArray($a);
print_r($flat);
/*
Array
(
    [0] => orange
    [1] => grape
    [2] => apple
    [3] => 1
    [4] => 2
    [5] => 3
    [6] => 4
    [7] => 5
    [8] => 6
    [9] => first
    [10] => second
    [11] => third
)
*/
  • 優點:處理任意深度巢狀陣列
  • 缺點:遞迴開銷大、丟失鍵名資訊(可改為保留 key 路徑)
  • 適用:深度未知的樹狀資料、表單欄位遞迴驗證

進階:保留鍵名路徑的遞迴遍歷

<?php
function walkArray($array, $path = '', &$result = []) {
    foreach ($array as $key => $value) {
        $currentPath = $path ? "$path.$key" : (string)$key;
        if (is_array($value)) {
            walkArray($value, $currentPath, $result);
        } else {
            $result[$currentPath] = $value;
        }
    }
    return $result;
}

$walked = walkArray($a);
/*
Array
(
    [fruits.a] => orange
    [fruits.b] => grape
    [fruits.c] => apple
    [numbers.0] => 1
    ...
)
*/

效能與選擇建議

場景推薦方法理由
固定二維陣列雙層 foreach零函數呼叫開銷,最快
不定深度/動態結構遞迴函數通用性強,程式碼可維護
需保留鍵名路徑帶路徑遞迴方便後續按路徑查找/更新
超大陣列(萬級+)迭代器/Generator避免遞迴堆疊溢出,記憶體友善

PHP 內建替代方案

  • array_walk_recursive():內建遞迴遍歷,效能優於自寫遞迴
  • RecursiveArrayIterator + RecursiveIteratorIterator:SPL 迭代器,物件導向風格
<?php
// 內建遞迴遍歷範例
$result = [];
array_walk_recursive($a, function($value, $key) use (&$result) {
    $result[] = $value;
});
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved