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

PHP array_merge 與 array_merge_recursive 深度解析:鍵名衝突、數值索引重組與多維陣列合併策略

     編輯:PHP 相關知識

array_merge() 是 PHP 合併陣列的核心函數,但其對**字串鍵**與**數值鍵**的處理邏輯截然不同,誤用易導致資料遺失或索引錯亂。本文詳細解析並提供最佳實務。

核心規則

鍵型別array_merge 行為array_merge_recursive 行為
字串鍵 (關聯陣列)**後者覆蓋前者****遞迴合併**,同鍵值變為陣列
數值鍵 (索引陣列)**重新編號從 0 開始**,依序附加同 array_merge(數值鍵不遞迴)

範例 1:字串鍵衝突

<?php
$book1 = ['linux' => 'Linux 伺服器設定', 'php' => 'PHP 程式設計'];
$book2 = ['linux' => '伺服器管理實戰', 'jsp' => 'JSP 開發'];

print_r(array_merge($book1, $book2));
/* 輸出:
Array
(
    [linux] => 伺服器管理實戰   // 被覆蓋
    [php] => PHP 程式設計
    [jsp] => JSP 開發
)
*/

print_r(array_merge_recursive($book1, $book2));
/* 輸出:
Array
(
    [linux] => Array
        (
            [0] => Linux 伺服器設定
            [1] => 伺服器管理實戰
        )
    [php] => PHP 程式設計
    [jsp] => JSP 開發
)
*/
?>

範例 2:數值鍵重組

<?php
$arr1 = ['Linux 伺服器設定', 'PHP 程式設計'];
$arr2 = ['伺服器管理實戰', 'JSP 開發'];

print_r(array_merge($arr1, $arr2));
/* 輸出:
Array
(
    [0] => Linux 伺服器設定
    [1] => PHP 程式設計
    [2] => 伺服器管理實戰
    [3] => JSP 開發
)
索引重新從 0 連續編號
*/
?>

範例 3:混合鍵與多維陣列

<?php
$a = [0 => 'a', 'x' => ['a1', 'a2'], 1 => 'b'];
$b = [0 => 'c', 'x' => ['b1'], 'y' => 'y1'];

print_r(array_merge($a, $b));
/* 輸出:
Array
(
    [0] => a
    [x] => Array ( [0] => b1 )          // 字串鍵 'x' 被覆蓋,原陣列遺失
    [1] => b
    [2] => c                            // 數值鍵重新編號
    [y] => y1
)
*/
?>

進階合併策略

策略一:保留數值鍵原索引 → 使用 + 運算子

<?php
$arr1 = [5 => 'a', 6 => 'b'];
$arr2 = [7 => 'c', 8 => 'd'];
$result = $arr1 + $arr2; // [5=>'a', 6=>'b', 7=>'c', 8=>'d'] 索引不變
?>

策略二:深度合併多維關聯陣列(自訂遞迴)

<?php
function array_merge_deep(array ...$arrays): array {
    $result = [];
    foreach ($arrays as $arr) {
        foreach ($arr as $key => $value) {
            if (is_int($key)) {
                $result[] = $value; // 數值鍵重新編號
            } elseif (isset($result[$key]) && is_array($result[$key]) && is_array($value)) {
                $result[$key] = array_merge_deep($result[$key], $value); // 遞迴
            } else {
                $result[$key] = $value; // 字串鍵覆蓋
            }
        }
    }
    return $result;
}
?>

策略三:使用 Symfony ArrayHelper / Laravel Arr::merge()

成熟框架提供更語意化的合併方法(如 Arr::mergeRecursiveDistinct),專案若引用框架請優先使用。

選型建議

  • 單純索引陣列合併 → array_merge(需重新編號)或 +(保留索引)。
  • 關聯陣列合併,允許覆蓋 → array_merge。
  • 關聯陣列合併,需保留衝突值 → array_merge_recursive 或自訂深度合併。
  • 多維設定陣列合併 → 框架輔助函數或自訂遞迴策略。

理解鍵型別差異,避免「莫名其妙資料不見」的經典坑。

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