array_intersect(array $array, array ...$arrays): array
返回 第一個陣列中同時存在於所有其他陣列的值 組成的新陣列。**鍵名保持不變**。
$array1 = ['a' => 'green', 0 => 'red', 1 => 'blue'];
$array2 = ['b' => 'green', 0 => 'yellow', 1 => 'red'];
$result = array_intersect($array1, $array2);
// 結果:['a' => 'green', 0 => 'red']
// 說明:值 'green' 和 'red' 在兩個陣列都存在,保留 $array1 的鍵名
$a = ['x' => 1, 'y' => 2, 'z' => 3];
$b = ['y' => 20, 'z' => 30, 'w' => 40];
array_intersect_key($a, $b); // ['y' => 2, 'z' => 3] 只看鍵名
$a = ['x' => 1, 'y' => 2];
$b = ['y' => 2, 'x' => 1];
array_intersect_assoc($a, $b); // ['y' => 2] 順序不同導致 'x' 不匹配
$a = ['Apple', 'Banana', 'Cherry'];
$b => ['apple', 'BANANA', 'durian'];
// 不區分大小寫比較
array_uintersect($a, $b, 'strcasecmp'); // ['Apple', 'Banana']
$userTags = ['php', 'laravel', 'mysql', 'redis'];
$requiredTags = ['php', 'mysql'];
$hasPermission = count(array_intersect($userTags, $requiredTags)) === count($requiredTags);
// true:用戶擁有所有必需標籤
$idsFromDB = [101, 102, 103, 104, 105];
$idsFromCache = [103, 104, 105, 106];
$commonIds = array_intersect($idsFromDB, $idsFromCache); // [103, 104, 105]
$input = ['name' => 'Tom', 'age' => 20, 'email' => 'tom@ex.com', 'hack' => 'evil'];
$whitelist = ['name', 'age', 'email'];
$safeData = array_intersect_key($input, array_flip($whitelist));
// ['name' => 'Tom', 'age' => 20, 'email' => 'tom@ex.com']
| 項目 | 說明 |
|---|---|
| 時間複雜度 | O(n*m) 其中 n 為第一個陣列長度,m 為其他陣列總長度。內部使用哈希表,實際極快。 |
| 大數據量優化 | 若陣列超大(>10萬),考慮先 `array_flip` 將值轉鍵,利用 `isset` O(1) 查找,或使用資料庫 `INTERSECT` / Redis `SINTER`。 |
| 類型轉換陷阱 | `'1'` (string) 和 `1` (int) 視為相同。嚴格類型需用 `array_uintersect` + `===` 回調。 |
| 鍵名保留影響 | 若後續需 `json_encode` 輸出純列表,記得 `array_values()` 重建索引。 |
| 函數 | 比較依據 | 鍵名處理 | 典型用途 |
|---|---|---|---|
| array_intersect | 值 | 保留第一個陣列鍵名 | 找共同值 |
| array_intersect_key | 鍵名 | 保留第一個陣列鍵名 | 白名單過濾鍵 |
| array_intersect_assoc | 鍵+值 | 保留第一個陣列鍵名 | 精確匹配鍵值對 |
| array_uintersect | 自定義值比較 | 保留第一個陣列鍵名 | 不區分大小寫、對象比較 |
靈活運用 `array_intersect` 族函數,能大幅簡化業務邏輯代碼,提升可讀性與性能。