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

PHP 數組合併差異深度解析:array_merge vs + 運算符鍵名保留與覆蓋規則

     編輯:PHP 綜合知識

PHP 提供 array_merge() 和 + 運算符兩種數組合併方式,對數字鍵、字符串鍵、重複鍵的處理邏輯截然不同,選錯易導致數據丟失或結構錯亂。

核心規則對比

場景array_merge()$a + $b
字符串鍵重複後者覆蓋前者前者保留,後者忽略
數字鍵重複重新索引 (0,1,2...)前者保留,後者忽略
數字鍵不重複重新索引保留原鍵名
字符串鍵不重複合並保留合並保留
返回值類型新數組新數組

實戰演示

<?php
$a = ['d' => 'aass', 'e' => 'adsdfd', 'asd' => 'asdsdd', 'ddfg' => 'dssdf'];
$b = ['d' => 'adddd', 0 => 'adsdfd', 1 => 'asdfsddddd', 'd' => 'aass'];

// array_merge: 字符串鍵 'd' 後者覆蓋,數字鍵 0,1 重新索引追加
$merged = array_merge($a, $b);
/* 結果:
[
    'd' => 'aass',        // $b 最後的 'd' => 'aass' 覆蓋
    'e' => 'adsdfd',
    'asd' => 'asdsdd',
    'ddfg' => 'dssdf',
    0 => 'adsdfd',        // 重新索引 0
    1 => 'asdfsddddd',    // 重新索引 1
]
*/

// + 運算符: 字符串鍵 'd' 保留 $a,數字鍵 0,1 保留 $b 原鍵
$union = $a + $b;
/* 結果:
[
    'd' => 'aass',        // $a 保留
    'e' => 'adsdfd',
    'asd' => 'asdsdd',
    'ddfg' => 'dssdf',
    0 => 'adsdfd',        // $b 保留
    1 => 'asdfsddddd',    // $b 保留
]
*/

視覺化差異演示

// 情況 1: 純數字索引數組
$arr1 = [1, 2, 3];  // [0=>1, 1=>2, 2=>3]
$arr2 = [4, 5];     // [0=>4, 1=>5]

array_merge($arr1, $arr2); // [0=>1, 1=>2, 2=>3, 3=>4, 4=>5] 重新索引
$arr1 + $arr2;             // [0=>1, 1=>2, 2=>3] $arr2 完全被忽略!

// 情況 2: 關聯數組
$assoc1 = ['a' => 1, 'b' => 2];
$assoc2 = ['b' => 20, 'c' => 30];

array_merge($assoc1, $assoc2); // ['a'=>1, 'b'=>20, 'c'=>30] 後者覆蓋
$assoc1 + $assoc2;             // ['a'=>1, 'b'=>2, 'c'=>30] 前者優先

// 情況 3: 混合鍵名
$mix1 = [0 => 'a', 'x' => 1];
$mix2 = [1 => 'b', 'x' => 2];

array_merge($mix1, $mix2); // [0=>'a', 1=>'b', 'x'=>2] 數字重新索引,字符串覆蓋
$mix1 + $mix2;             // [0=>'a', 'x'=>1, 1=>'b'] 保留所有原鍵

選型決策指南

  • 需保留字符串鍵、後者優先覆蓋:array_merge() (最常用)
  • 需保留數字鍵原索引、前者優先:$a + $b
  • 配置合併 (默認值 + 用戶覆蓋):array_merge($defaults, $user)
  • 多源數據聚合、避免覆蓋:$a + $b + $c
  • 遞歸合併多維數組:array_merge_recursive() 或自定義遞歸函數

性能微差異

  • + 運算符略快 (語言構造,無函數調用開銷)
  • array_merge() 支持可變參數:array_merge($a, $b, $c...)
  • 大數組合併建議預分配或使用引用傳遞優化

陷阱提醒

// ❌ 錯誤:以為 + 能合併數字索引
$list = [1,2,3] + [4,5];  // 結果 [1,2,3] 而非 [1,2,3,4,5]

// ✅ 正確:數字索引合併用 array_merge
$list = array_merge([1,2,3], [4,5]); // [1,2,3,4,5]

// ❌ 陷阱:字符串鍵名數字化
$arr = ['0' => 'a', '1' => 'b'];  // 這是字符串鍵!
$arr + ['0' => 'c']; // ['0'=>'a', '1'=>'b'] 字符串鍵 '0' 不覆蓋

記憶口訣:array_merge 重索引、後蓋前;+ 保鍵名、前擋後。

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