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

PHP 陣列合並陷阱:array("a") + array("b") 為何結果仍是 array("a")?

     編輯:PHP 綜合知識

現象復現

<?php
var_dump(array("a") + array("b")); // 輸出 array(1) { [0]=> string(1) "a" }
?>

根本原因:鍵名衝突與「先到先得」

  • PHP 陣列預設為整數索引從 0 開始,array("a") 等價於 array(0 => "a")。
  • + 運算子合並規則:右側陣列中與左側鍵名相同的元素被忽略,左側值保留。
  • 兩個陣列鍵名均為 0,故右側 "b" 被丟棄。

關聯陣列同理

$a = ['k' => 'a'];
$b = ['k' => 'b'];
var_dump($a + $b); // ['k' => 'a']  左側勝出
var_dump($b + $a); // ['k' => 'b']  順序互換,右側變左側,結果反轉

array_merge() 差異對比

場景+ 運算子array_merge()
字串鍵名相同左側保留,右側忽略右側覆蓋左側
數字鍵名相同左側保留,右側忽略重新索引(0,1,2...)追加,不覆蓋
數字鍵名不同保留原鍵名合並重新索引追加

代碼驗證

$a = [1 => 'A', 2 => 'B'];
$b = [4 => 'C', 1 => 'D'];

var_dump($a + $b);
// [1=>'A', 2=>'B', 4=>'C']  鍵名 1 衝突,左側 'A' 勝出

var_dump(array_merge($a, $b));
// [0=>'A', 1=>'B', 2=>'C', 3=>'D']  重新索引,'D' 追加在後

同一陣列內重複鍵名行為

$arr = [
    10,          // 0 => 10
    5  => 6,     // 5 => 6
    3  => 7,     // 3 => 7
    'a' => 4,    // 'a' => 4
    11,          // 6 => 11  (最大整數鍵 5 → 下一個 6)
    '8' => 2,    // 8 => 2   (數值字串鍵自動轉整數)
    '02' => 77,  // '02' => 77 (非純數字字串保留字串鍵)
    0  => 12,    // 0 => 12  覆蓋最初的 10
];
var_dump($arr);
// 0 => 12, 3 => 7, 5 => 6, 6 => 11, 8 => 2, 'a' => 4, '02' => 77

結論:同一陣列字面量中,後出現的同名鍵覆蓋先前值(整數鍵與數值字串鍵視為同一鍵)。

實戰避坑指南

  1. 合並配置陣列用 array_merge($default, $user),讓用戶配置覆蓋預設值。
  2. 合並 ID 索引數據用 + 保留原鍵,或 array_replace()(行為同 + 但支援多陣列)。
  3. 需重新索引用 array_values(array_merge(...))。
  4. 避免在同一字面量中重複鍵名,啟用 IDE 靜態檢查或 php -l 發現。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved