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

PHP 陣列合併、遞歸合併與鍵值組合:三大核心函數深度解析

     編輯:PHP 相關知識

陣列操作是 PHP 日常開發的高頻場景。array_merge()、array_merge_recursive()、array_combine() 三個函數雖名稱相似,但行為差異巨大。搞不清規則極易導致資料覆蓋、索引錯位等隱蔽 Bug。本文通過圖解與實測,徹底釐清三者異同。

一、array_merge():合併並重置數字索引

核心規則:

  • 字串鍵:後者覆蓋前者
  • 數字鍵:不覆蓋,重新從 0 開始連續索引
  • 單一數字索引陣列傳入時,會重置索引

實測範例:

<?php
$face = ['J', 'Q', 'K', 'A'];        // 索引 0-3
$numbered = ['2','3','4','5','6','7','8','9']; // 索引 0-7
$cards = array_merge($face, $numbered);
// 結果:['J','Q','K','A','2','3','4','5','6','7','8','9'] 索引 0-11 連續
?>

字串鍵覆蓋行為:

<?php
$a = ['color' => 'red', 'size' => 'M'];
$b = ['color' => 'blue', 'shape' => 'circle'];
$merged = array_merge($a, $b);
// 結果:['color' => 'blue', 'size' => 'M', 'shape' => 'circle']
?>

數字鍵重置行為:

<?php
$a = [5 => 'a', 8 => 'b'];
$b = [10 => 'c'];
$merged = array_merge($a, $b);
// 結果:[0 => 'a', 1 => 'b', 2 => 'c'] 索引完全重置!
?>

二、array_merge_recursive():相同鍵遞歸合併為陣列

核心差異:

遇到相同字串鍵時,不覆蓋,而是將兩值合併為新陣列(遞歸處理)。數字鍵行為同 array_merge()。

實測範例:

<?php
$class1 = ['John' => 100, 'James' => 85];
$class2 = ['Micky' => 78, 'John' => 45];
$scores = array_merge_recursive($class1, $class2);
/* 結果:
[
    'John' => [100, 45],  // 合併為陣列!
    'James' => 85,
    'Micky' => 78
]
*/
?>

巢狀陣列遞歸合併:

<?php
$a = ['user' => ['name' => 'Tom', 'tags' => ['php']]];
$b = ['user' => ['email' => 'tom@ex.com', 'tags' => ['laravel']]];
$merged = array_merge_recursive($a, $b);
/* 結果:
'user' => [
    'name' => 'Tom',
    'email' => 'tom@ex.com',
    'tags' => ['php', 'laravel']  // 遞歸合併!
]
*/
?>

三、array_combine():以一陣列為鍵、另一陣列為值建立關聯陣列

核心要求:

  • 兩陣列長度必須相等
  • 第一個陣列值作為鍵(需為合法鍵型別:int/string)
  • 第二個陣列值作為值
  • 任一陣列為空拋出 ValueError(PHP 8.0+)

實測範例:

<?php
$abbreviations = ['AL', 'AK', 'AZ', 'AR'];
$states = ['Alabama', 'Alaska', 'Arizona', 'Arkansas'];
$map = array_combine($abbreviations, $states);
// 結果:['AL'=>'Alabama', 'AK'=>'Alaska', 'AZ'=>'Arizona', 'AR'=>'Arkansas']
?>

常見用途:

  • 資料庫查詢結果轉為 id => row 映射表
  • CSV 標題行與資料行組合
  • 表單欄位名與驗證規則配對

三大函數對比速查表

特性array_mergearray_merge_recursivearray_combine
主要用途合併多個陣列合併並保留衝突值建立鍵值映射
字串鍵衝突後覆蓋前合併為陣列不適用(第一陣列為鍵)
數字鍵處理重置索引重置索引不適用
參數數量1+1+固定 2 個
長度要求無無必須相等
回傳型別陣列陣列(值可能為陣列)關聯陣列

實戰選型指南

場景推薦函數理由
多個設定陣列合併,後者優先array_merge符合配置覆蓋語義
收集多來源同名欄位(如多表單提交)array_merge_recursive保留所有值不丟失
ID 列表與對應資料組合成查找表array_combineO(1) 查找效能
保留原有數字索引不重置+ 運算子$a + $b 保留鍵不重置

補充:+ 運算子合併陣列

<?php
$a = [1 => 'a', 2 => 'b'];
$b = [2 => 'c', 3 => 'd'];
$c = $a + $b;
// 結果:[1 => 'a', 2 => 'b', 3 => 'd'] 
// $a 的鍵優先,$b 只有不存在的鍵才會加入
?>

注意:+ 運算子不重置數字索引,不覆蓋既有鍵,語義更接近「補全」。

總結

  • array_merge:最常用,合併並正規化索引
  • array_merge_recursive:特定場景(收集同名多值)才用
  • array_combine:建立映射表的利器
  • + 運算子:需保留原索引、不覆蓋時的補充方案

記住核心規則,陣列合併不再踩坑,代碼更健壯優雅。

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