array_intersect() 計算多個陣列的「值交集」,**完全忽略鍵名**,僅保留同時出現在所有陣列中的值,並保留第一個陣列中對應的鍵名。本文詳細說明鬆散比較機制、鍵名保留行為、型別轉換陷阱與實戰應用。
語法與參數
array_intersect(array $array, array ...$arrays): array
| 參數 | 必要性 | 說明 |
$array | 必填 | 基準陣列,其值將與後續陣列比較。 |
$arrays | 選填(可多個) | 一個或多個比較陣列。 |
核心行為規則
- 純值比較:鍵名不參與判斷,不同鍵名但相同值視為匹配。
- 鬆散比較
==:1 == '1'、0 == false、'' == null 皆為 true,**非嚴格型別檢查**。
- 保留基準鍵名:結果取自第一個陣列中符合條件元素的「原始鍵名與值」。
- 重複值處理:基準陣列中重複值若匹配,全部保留(各自保留原鍵名)。
實戰範例解析
範例 1:基本值交集
<?php
$a1 = [0 => 'Cat', 1 => 'Dog', 2 => 'Horse'];
$a2 = [3 => 'Horse', 4 => 'Dog', 5 => 'Fish'];
$result = array_intersect($a1, $a2);
print_r($result);
// 輸出:
// Array (
// [1] => Dog
// [2] => Horse
// )
// 解析:值 'Dog'、'Horse' 同時存在,保留 $a1 原鍵名 1、2
?>
範例 2:鬆散比較陷阱
<?php
$a1 = [0 => 1, 1 => '1', 2 => true, 3 => 0, 4 => false, 5 => ''];
$a2 = ['a' => '1', 'b' => 1, 'c' => true];
$result = array_intersect($a1, $a2);
print_r($result);
// 輸出:
// Array (
// [0] => 1
// [1] => 1
// [2] => 1
// )
// 解析:$a1 中 1、'1'、true 經鬆散比較皆等於 $a2 中的值,全數保留
// ⚠️ 若需嚴格比較,請用 array_intersect_assoc() 或 array_uintersect()
?>
範例 3:重複值保留行為
<?php
$a1 = ['a' => 'x', 'b' => 'y', 'c' => 'x', 'd' => 'z'];
$a2 = ['p' => 'x', 'q' => 'w'];
$result = array_intersect($a1, $a2);
print_r($result);
// 輸出:
// Array (
// [a] => x
// [c] => x
// )
// 兩個 'x' 皆保留,鍵名分別為 a、c
?>
範例 4:實戰 - 多來源標籤共現分析
<?php
$articleTags = [
'art1' => ['php', 'laravel', 'api', 'backend'],
'art2' => ['php', 'symfony', 'api', 'orm'],
'art3' => ['python', 'django', 'api', 'orm'],
'art4' => ['php', 'laravel', 'queue', 'redis'],
];
// 找出所有文章共同擁有的標籤
$common = array_intersect(...array_values($articleTags));
print_r($common);
// 輸出:['api'] (僅 api 在四篇文章都出現)
?>
函式族群完整對照
| 函式 | 比較鍵名 | 比較值 | 值比較模式 | 鍵名來源 | 典型場景 |
array_intersect() | ❌ | ✅ | 鬆散 == | 第一個陣列 | 標籤共現、詞彙交集 |
array_intersect_key() | ✅ | ❌ | - | 第一個陣列 | 配置鍵名對齊 |
array_intersect_assoc() | ✅ | ✅ | 嚴格 === | 第一個陣列 | 精確鍵值對驗證 |
array_uintersect() | ❌ | ✅ | 自訂回調 | 第一個陣列 | 複雜值比較(物件/容差) |
效能與優化建議
- 時間複雜度:O(n×m),內部將比較陣列值建立雜湊表,基準陣列遍歷查找 O(1)。
- 大陣列優化:若比較陣列固定,預先
array_flip() 建立值→存在查找表,手寫迴圈可減少函式呼叫開銷。
- 記憶體:回傳基準陣列子集,增量可控。
常見錯誤與避坑指南
| 錯誤現象 | 根因 | 修正方案 |
| 數字 1 與字串 '1' 被視為相同 | 鬆散比較 == | 改用 array_uintersect($a1,$a2, fn($a,$b)=>($a>$b)-($a<$b)) 實現嚴格比較 |
| false、0、'' 互相匹配 | 鬆散比較轉型規則 | 資料清洗階段統一型別,或用嚴格比較函式 |
| 期望取得所有陣列的共同值集合 | 誤解回傳來源 | 理解:僅回傳第一個陣列中符合條件的元素 |
array_intersect() 以鬆散值比較為核心,適合標籤、關鍵字、ID 列表等「值導向」交集場景;涉及鍵名語意或嚴格型別時,請選擇 _assoc 或 _uintersect 變體。