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

PHP 陣列合併與遞歸合併完整指南:array_merge vs array_merge_recursive 差異解析

     編輯:PHP 相關知識

前言

陣列合併是 PHP 開發高頻操作。array_merge() 與 array_merge_recursive() 雖名稱相似,但對鍵名衝突、數值索引、多維陣列的處理截然不同。本文透過範例深度解析兩者差異與適用場景。

array_merge():扁平合併,後者覆蓋同名字串鍵

$fruits = ["apple", "banana", "pear"];
$numbers = ["1", "2", "3"];
$merged = array_merge($fruits, $numbers);
// 結果: ["apple", "banana", "pear", "1", "2", "3"]
// 數值索引重新排序 (0,1,2,3,4,5)

關鍵行為

  • 數值索引:重新編號從 0 開始,不保留原鍵名。
  • 字串鍵名:相同鍵名時,後面陣列的值覆蓋前面。
  • 單一陣列傳入:重新索引數值鍵 (等同 array_values())。
$a = ["x" => 1, "y" => 2];
$b = ["y" => 99, "z" => 3];
print_r(array_merge($a, $b));
// 結果: ["x" => 1, "y" => 99, "z" => 3]  // y 被覆蓋

array_merge_recursive():遞歸合併,同名鍵值轉為陣列

$fruit1 = ["apple" => "red", "banana" => "yellow"];
$fruit2 = ["pear" => "yellow", "apple" => "green"];
$result = array_merge_recursive($fruit1, $fruit2);
// 結果:
// [
//   "apple"  => ["red", "green"],
//   "banana" => "yellow",
//   "pear"   => "yellow"
// ]

關鍵行為

  • 字串鍵名衝突:不覆蓋,而是將兩值合併為索引陣列 (如上例 apple)。
  • 數值索引:同 array_merge(),重新排序。
  • 多維陣列:遞歸進入子陣列執行相同邏輯。
$a = ["config" => ["debug" => true, "env" => "dev"]];
$b = ["config" => ["debug" => false, "log" => "/var/log"]];
print_r(array_merge_recursive($a, $b));
// 結果:
// [
//   "config" => [
//     "debug" => [true, false],
//     "env"   => "dev",
//     "log"   => "/var/log"
//   ]
// ]

比較總結表

特性array_merge()array_merge_recursive()
字串鍵衝突後者覆蓋合併為陣列
數值索引重新排序重新排序
多維陣列僅第一層合併遞歸合併所有層級
適用場景配置覆蓋、列表拼接資料聚合、多來源收集

進階技巧

  1. 保留數值鍵不重新索引:使用 + 運算子 ($a + $b) ,鍵名不衝突時保留原索引,衝突時左邊優先 (不覆蓋)。
  2. 深度合併且後者優先:自寫遞歸函數或使用 symfony/polyfill 的 array_merge_recursive_distinct。
  3. 大量陣列合併效能:array_merge 接受可變參數,一次傳入多個陣列比迴圈合併快。

總結

理解 array_merge (覆蓋) 與 array_merge_recursive (聚合) 的核心差異,能避免配置合併、資料匯總等常見邏輯錯誤。根據業務需求選擇正確函數,或組合 + 運算子實現更精確的合併語意。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved