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

PHP 多維陣列所有數值翻倍的兩種實作(遞迴 vs array_walk_recursive)

     編輯:PHP 相關知識

需求

給定任意深度的多維陣列,將所有標量數值乘以 2,保持結構不變。

方法一:手寫遞迴

<?php
function doubleValuesRecursive(array $arr): array
{
    foreach ($arr as $key => $value) {
        if (is_array($value)) {
            $arr[$key] = doubleValuesRecursive($value);
        } elseif (is_numeric($value)) {
            $arr[$key] = $value * 2;
        }
        // 非數值標量(字串、布林、null)保持不變
    }
    return $arr;
}

$data = [1, 3, 'a' => 20, 'b' => [2, 4, 6, 'c' => 7]];
$result = doubleValuesRecursive($data);
print_r($result);
/*
Array
(
    [0] => 2
    [1] => 6
    [a] => 40
    [b] => Array
        (
            [0] => 4
            [1] => 8
            [2] => 12
            [c] => 14
        )
)
*/

方法二:array_walk_recursive(推薦)

<?php
$data = [1, 3, 'a' => 20, 'b' => [2, 4, 6, 'c' => 7]];

array_walk_recursive($data, function(&$value, $key) {
    if (is_numeric($value)) {
        $value *= 2;
    }
});

print_r($data); // 直接修改原陣列,無需回傳

比較

特性遞迴函式array_walk_recursive
程式碼量較多極少
效能函式呼叫開銷C 內建迭代,較快
修改方式回傳新陣列(不可變風格)傳址修改原陣列
鍵名保留完整保留完整保留
可控制深度容易加入深度參數需自行實作包裝

進階:只翻倍特定鍵名

$targetKeys = ['price', 'amount', 'total'];
array_walk_recursive($data, function(&$value, $key) use ($targetKeys) {
    if (is_numeric($value) && in_array($key, $targetKeys, true)) {
        $value *= 2;
    }
});

注意事項

  • `array_walk_recursive` **不會進入** `ArrayObject`、`Traversable` 物件,僅處理純陣列。
  • 回呼函式必須使用 **傳址** `&$value` 才能修改原值。
  • 若陣列包含循環引用,兩種方法都會無限遞迴 → 需加入已訪問集合檢查。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved