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

PHP array_merge 數字鍵名重新索引陷阱與解決方案

     編輯:PHP 相關知識

PHP array_merge 數字鍵名重新索引陷阱與解決方案

array_merge() 在處理數字索引陣列時,會**重新排序並從 0 開始連續索引**,而非覆蓋同鍵值。這行為常導致邏輯錯誤。

現象演示

<?php
$a1 = [1 => 'abc', 3 => 10];
$a2 = [1 => 'efg', 3 => 20];
print_r(array_merge($a1, $a2));
/*
輸出:
Array
(
    [0] => abc   // 原鍵 1 變 0
    [1] => 10    // 原鍵 3 變 1
    [2] => efg   // 原鍵 1 變 2
    [3] => 20    // 原鍵 3 變 3
)
*/

官方文件說明:「若陣列包含數字鍵名,後方值不會覆蓋,而是附加在後並重新索引。」

解決方案

需求方案範例
保留數字鍵名,後者覆蓋前者使用 + 運算子$result = $a1 + $a2; → `[1=>'abc', 3=>10]` (左優先)
保留數字鍵名,前者覆蓋後者$result = $a2 + $a1;→ `[1=>'efg', 3=>20]`
字串鍵名正常合併 (後覆蓋前)array_merge 行為正確['a'=>1] + ['a'=>2] → `['a'=>1]` (左優先)
array_merge(['a'=>1], ['a'=>2]) → `['a'=>2]`
需遞迴合併多維陣列自寫遞迴函式或用 array_merge_recursive (注意數值會被包成陣列)見下方

遞迴合併範例 (後者覆蓋前者,保留數字鍵)

function arrayMergeRecursiveDistinct(array &$a1, array $a2): array {
    foreach ($a2 as $k => $v) {
        if (is_array($v) && isset($a1[$k]) && is_array($a1[$k])) {
            $a1[$k] = arrayMergeRecursiveDistinct($a1[$k], $v);
        } else {
            $a1[$k] = $v;
        }
    }
    return $a1;
}

最佳實踐建議

  • 明確語意:合併字串鍵陣列用 array_merge,合併數字鍵/混合鍵且需保留鍵名用 +。
  • 若來源陣列鍵名類型不確定,先統一轉為字串鍵:array_merge((array)$a1, (array)$a2) 仍會重新索引數字鍵,建議顯式處理。
  • 單元測試覆蓋陣列合併邊界情況 (空陣列、純數字鍵、混合鍵)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved