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

PHP 陣列交集與差集完整指南:array_intersect、array_diff 及關聯鍵值版本深度解析

     編輯:PHP 綜合知識

陣列集合運算是資料處理高頻需求:找共同元素 (交集)、找差異元素 (差集)。PHP 提供四組核心函數,分別針對「僅比較值」與「比較鍵+值」兩種語意。本文系統整理 array_intersect、array_intersect_assoc、array_diff、array_diff_assoc 的行為差異、參數說明、實戰範例與常見陷阱。

四大核心函數對照表

函數比較依據返回內容鍵名保留
array_intersect值所有陣列中都出現的值✅ 保留第一個陣列的鍵
array_intersect_assoc鍵 + 值所有陣列中鍵值都相同的對✅ 保留
array_diff值第一個陣列有、其他陣列沒有的值✅ 保留第一個陣列的鍵
array_diff_assoc鍵 + 值第一個陣列有、其他陣列鍵值不全同的對✅ 保留

交集運算實戰範例

1. 僅比較值:array_intersect()

$fruit1 = ["Apple", "Banana", "Orange"];
$fruit2 = ["Pear", "Apple", "Grape"];
$fruit3 = ["Watermelon", "Orange", "Apple"];

$intersection = array_intersect($fruit1, $fruit2, $fruit3);
print_r($intersection);
// Array ( [0] => Apple )  ← 只有 Apple 在三個陣列都出現
// 鍵名保留自 $fruit1 (索引 0)

2. 比較鍵值:array_intersect_assoc()

$fruit1 = ["red"=>"Apple", "yellow"=>"Banana", "orange"=>"Orange"];
$fruit2 = ["yellow"=>"Pear", "red"=>"Apple", "purple"=>"Grape"];
$fruit3 = ["green"=>"Watermelon", "orange"=>"Orange", "red"=>"Apple"];

$intersection = array_intersect_assoc($fruit1, $fruit2, $fruit3);
print_r($intersection);
// Array ( [red] => Apple )  ← 只有 red=>Apple 三個陣列完全相同
// yellow=>Banana/Pear 值不同;orange=>Orange 只有 fruit1/3 有

差集運算實戰範例

3. 僅比較值:array_diff()

$fruit1 = ["Apple", "Banana", "Orange"];
$fruit2 = ["Pear", "Apple", "Grape"];
$fruit3 = ["Watermelon", "Orange", "Apple"];

$diff = array_diff($fruit1, $fruit2, $fruit3);
print_r($diff);
// Array ( [1] => Banana )  ← 只有 Banana 獨佔於 $fruit1
// 鍵名 1 保留自 $fruit1

4. 比較鍵值:array_diff_assoc()

$fruit1 = ["red"=>"Apple", "yellow"=>"Banana", "orange"=>"Orange"];
$fruit2 = ["yellow"=>"Pear", "red"=>"Apple", "purple"=>"Grape"];
$fruit3 = ["green"=>"Watermelon", "orange"=>"Orange", "red"=>"Apple"];

$diff = array_diff_assoc($fruit1, $fruit2, $fruit3);
print_r($diff);
// Array ( [yellow] => Banana )  
// red=>Apple 三個都有;orange=>Orange 在 fruit1/3 有;yellow=>Banana 只在 fruit1 (fruit2 是 Pear)

關鍵行為細節與陷阱

⚠️ 必須注意
  • 型別敏感:"1" === 1 為 false。array_intersect([1], ["1"]) 返回空陣列。需先統一型別 (如 array_map('intval', $arr))。
  • 鍵名保留機制:返回陣列鍵名**永遠來自第一個參數陣列**。後續陣列的鍵名不影響結果結構。
  • array_intersect_assoc **要求鍵名完全相同**。[0=>'a'] 與 ['0'=>'a'] (字串鍵 vs 整數鍵) 視為不同。
  • 多陣列參數:支援任意數量陣列 array_intersect($a, $b, $c, $d...),邏輯為「第一個陣列的元素,在**所有**其他陣列中都存在」。
  • 效能:大陣列 (萬筆以上) 考慮先 array_flip 轉鍵值或使用 array_keys + array_intersect_key 以鍵名運算加速。

進階變體函數速查

  • array_intersect_key():僅比較**鍵名**,忽略值。
  • array_diff_key():僅比較**鍵名**差異。
  • array_uintersect() / array_udiff():自訂**值比較回呼函數** (如大小寫不敏感、物件比較)。
  • array_uintersect_assoc() / array_udiff_assoc():自訂值比較 + 鍵名比較。
  • array_intersect_uassoc() / array_diff_uassoc():自訂**鍵名比較回呼函數**。

熟練掌握這組集合運算函數,能以聲明式、可讀性高的代碼替代繁瑣的迴圈判斷,大幅提升資料處理開發效率與正確性。

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