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

PHP 二維陣列同鍵值求和:array_map 與 foreach 兩大高效方案

     編輯:PHP 相關知識

問題場景

處理多維陣列時,常需針對相同鍵名的子陣列值進行加總。例如訂單數據中 price、pnum 等欄位存儲為索引陣列,需快速計算總價、總數量。

原始數據結構

$ar = [
    'uid' => 19,
    'pid' => [91, 81],
    'price' => [6, 14],
    'pnum' => [1, 1],
];

方案一:array_map + array_sum(函數式風格)

<?php
$r = array_map(function($t) {
    return is_array($t) ? array_sum($t) : $t;
}, $ar);

print_r($r);
/* 輸出:
Array
(
    [uid] => 19
    [pid] => 172
    [price] => 20
    [pnum] => 2
)
*/

優點:代碼簡潔、聲明式風格、自動保留非陣列值。
適用:PHP 5.3+,鍵名固定、結構均勻的數據。

方案二:foreach 遍歷(過程式風格)

<?php
$arr = [];
foreach ($ar as $k => $v) {
    $arr[$k] = is_array($v) ? array_sum($v) : $v;
}
print_r($arr);

優點:邏輯直觀、易於調試、兼容舊版 PHP、便於加入額外業務邏輯(如類型檢查、日誌記錄)。

進階擴展:多層嵌套陣列遞歸求和

function deepArraySum($data) {
    if (!is_array($data)) return $data;
    return array_map('deepArraySum', $data);
}

// 配合 array_walk_recursive 實現任意深度求和
array_walk_recursive($ar, function(&$v) { $v = (int)$v; });
// 然後使用 array_map 或 foreach 進行聚合

效能對比建議

  • 小型陣列(< 1000 元素):差異可忽略,優先考慮可讀性。
  • 大型陣列:foreach 略快於 array_map(避免閉包開銷)。
  • 記憶體敏感場景:foreach 可就地修改原陣列,節省內存。

最佳實踐總結

  1. 優先使用 array_map 表達意圖清晰的簡單轉換。
  2. 涉及複雜條件、副作用或需極致效能時選 foreach。
  3. 始終先用 is_array() 守衛,避免 array_sum() 對標量報警告。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved