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

PHP 數組合並深度解析:array_merge vs + 號運算符的差異與陷阱

     編輯:PHP 綜合知識

兩種合並方式對比

特性array_merge()+ 運算符
數字鍵名重新索引(0,1,2...)保留原鍵名,後者不覆蓋前者
字符串鍵名後者覆蓋前者前者優先,後者忽略
返回值新數組新數組
性能稍慢(需重建索引)極快(僅鍵名查找)

實戰演示

<?php
$r = [1, 2, 3, 4, 5, 6];
$e = [7, 8, 9, 10];

// 數字索引陣列
var_dump($r + $e);          // [0=>1, 1=>2, 2=>3, 3=>4, 4=>5, 5=>6]  後者完全被忽略
var_dump(array_merge($r, $e)); // [0=>1, 1=>2, 2=>3, 3=>4, 4=>5, 5=>6, 6=>7, 7=>8, 8=>9, 9=>10]

// 關聯陣列(字符串鍵)
$a = ['x' => 1, 'y' => 2];
$b = ['y' => 20, 'z' => 30];
var_dump($a + $b);           // ['x'=>1, 'y'=>2, 'z'=>30]  'y' 保留第一個
var_dump(array_merge($a, $b)); // ['x'=>1, 'y'=>20, 'z'=>30] 'y' 被覆蓋

// 混合鍵名
$m1 = [0 => 'a', 'k' => 'b'];
$m2 = [1 => 'c', 'k' => 'd'];
var_dump($m1 + $m2);           // [0=>'a', 'k'=>'b', 1=>'c'] 數字鍵 1 保留,字符串鍵 k 保留第一個
var_dump(array_merge($m1, $m2)); // [0=>'a', 'k'=>'d', 1=>'c'] 重新索引數字鍵,字符串鍵覆蓋

核心規則總結

  1. 數字鍵:array_merge 重置為連續索引;+ 保留原索引,衝突時**左邊優先**。
  2. 字符串鍵:array_merge **右邊覆蓋**左邊;+ **左邊優先**,右邊忽略。
  3. 混合陣列:按上述規則分別處理各類鍵名。

常見陷阱與最佳實踐

陷阱 1:配置合並時意外丟失值

$default = ['debug' => false, 'limit' => 10];
$user    = ['limit' => 20];
$config = $default + $user; // 正確:['debug'=>false, 'limit'=>10] ❌ 用戶配置被忽略!
$config = array_merge($default, $user); // 正確:['debug'=>false, 'limit'=>20] ✅

配置合並**必須用 array_merge**,確保用戶配置覆蓋默認值。

陷阱 2:多維數組合並只做淺層

$a = ['db' => ['host' => 'localhost', 'port' => 3306]];
$b = ['db' => ['port' => 3307, 'charset' => 'utf8']];
array_merge($a, $b); // ['db' => ['port'=>3307, 'charset'=>'utf8']] host 丟失!
// 需遞歸合並
function array_merge_recursive_distinct(array &$a, array &$b) {
    foreach ($b as $k => $v) {
        if (is_array($v) && isset($a[$k]) && is_array($a[$k])) {
            array_merge_recursive_distinct($a[$k], $v);
        } else {
            $a[$k] = $v;
        }
    }
}

陷阱 3:大數組性能

+ 運算符為 O(n) 且不重建內存,array_merge 需分配新內存並複製。百萬級數組合並時,+ 快 5~10 倍。

進階:PHP 7.4+ 解包運算符 ...

$merged = [...$a, ...$b]; // 等同 array_merge($a, $b),語法更簡潔
$merged = ['default' => true, ...$userConfig]; // 覆蓋模式,等同 array_merge(['default'=>true], $userConfig)

注意:解包運算符遇到字符串鍵衝突會拋出 Error(PHP 8.1+),需確保鍵名不衝突或用 array_merge。

選擇指南

場景推薦方式理由
配置文件合並(用戶覆蓋默認)array_merge($default, $user)字符串鍵覆蓋語義正確
多個列表拼接(如分頁數據聚合)array_merge 或 [...$a, ...$b]重新索引便於遍歷
註冊表/映射表合並(鍵唯一,先註冊優先)$registry + $newEntries保留首次註冊,極快
大數組高性能合並+ 或 array_merge + yield 生成器避免內存峰值
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved