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

PHP array_intersect() 函式詳解:基於值比較的交集運算與型別陷阱

     編輯:PHP 相關知識

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 變體。

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