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

PHP array_intersect_assoc() 函式詳解:鍵名與值雙重比較的交集運算

     編輯:PHP 相關知識

array_intersect_assoc() 在計算交集時同時比較「鍵名」與「值」,只有**鍵名相同且值也相同**的元素才會被保留。比 array_intersect()(僅比值)更嚴格,比 array_intersect_key()(僅比鍵名)更精確,是驗證資料完整性、比對快照差異的精準工具。

語法與參數

array_intersect_assoc(array $array, array ...$arrays): array
參數必要性說明
$array必填基準陣列,其鍵值對需在所有比較陣列中完全匹配。
$arrays選填(可多個)一個或多個比較陣列,鍵名與值皆需相同。

核心比較邏輯

  • 嚴格相等:使用 === 比較值(型別+值皆同),鍵名同樣嚴格比較。
  • 保留基準結構:結果取自第一個陣列的鍵值對,順序保持。
  • 多陣列遞歸交集:$result = $array1 ∩ $array2 ∩ $array3 ...(鍵值對層面)。

實戰範例解析

範例 1:基本雙陣列交集

<?php
$a1 = [0 => 'Cat', 1 => 'Dog', 2 => 'Horse'];
$a2 = [3 => 'Horse', 1 => 'Dog', 0 => 'Cat'];

$result = array_intersect_assoc($a1, $a2);
print_r($result);
// 輸出:
// Array (
//     [0] => Cat
//     [1] => Dog
// )
// 解析:
// 索引 0:值 'Cat' 同 → 保留
// 索引 1:值 'Dog' 同 → 保留
// 索引 2:$a2 無索引 2 → 排除
// 索引 3:$a1 無索引 3 → 不在基準
?>

範例 2:三陣列遞歸交集

<?php
$a1 = [0 => 'Cat', 1 => 'Dog', 2 => 'Horse'];
$a2 = [3 => 'Horse', 1 => 'Dog', 5 => 'Fish'];
$a3 = [6 => 'Cow', 1 => 'Dog', 8 => 'Fish'];

$result = array_intersect_assoc($a1, $a2, $a3);
print_r($result);
// 輸出:
// Array (
//     [1] => Dog
// )
// 解析:僅索引 1 在三陣列中鍵名、值皆同
?>

範例 3:關聯陣列精確比對 - 設定檔驗證

<?php
$default = [
    'debug' => false,
    'cache_ttl' => 3600,
    'driver' => 'redis',
    'prefix' => 'app_'
];
$userSet = [
    'debug' => true,
    'cache_ttl' => 3600,
    'driver' => 'redis',
    'prefix' => 'app_',
    'extra' => 'ignored'
];

$matched = array_intersect_assoc($userSet, $default);
print_r($matched);
// 輸出:
// Array (
//     [cache_ttl] => 3600
//     [driver] => redis
//     [prefix] => app_
// )
// debug 值不同被排除,extra 不在基準被忽略
?>

範例 4:資料快照比對 - 偵測未變更欄位

<?php
$old = ['status' => 1, 'balance' => 1000, 'level' => 5, 'updated_at' => '2024-01-01'];
$new = ['status' => 1, 'balance' => 1500, 'level' => 5, 'updated_at' => '2024-01-02'];

$unchanged = array_intersect_assoc($old, $new);
print_r($unchanged);
// 輸出:
// Array (
//     [status] => 1
//     [level] => 5
// )
// 快速找出未修改欄位,可用於審計日誌優化(僅記錄變更)
?>

與相關函式關鍵差異

函式比較鍵名比較值值比較方式回傳來源
array_intersect()❌✅鬆散 ==第一個陣列
array_intersect_key()✅❌-第一個陣列
array_intersect_assoc()✅✅嚴格 ===第一個陣列
array_intersect_uassoc()✅(自訂)✅嚴格 ===第一個陣列

效能與使用建議

  • 適用資料量:萬級以內陣列效能極佳;百萬級建議改用資料庫 JOIN 或鍵名索引查找。
  • 型別一致性:確保比較雙方值型別一致(如整數不混入字串),否則 1 !== '1' 導致匹配失敗。
  • 替代方案:需自訂鍵名比較(如大小寫不敏感)用 array_intersect_uassoc();需自訂值比較(如浮點數容差)需自行迴圈實現。

常見陷阱

  • ❌ 混淆 array_intersect()(值交集)與 array_intersect_assoc()(鍵值對交集)。
  • ❌ 忽略 === 嚴格比較特性,導致 0 !== '0'、false !== 0 等預期外排除。
  • ❌ 以為會合併多陣列值 → 實際僅回傳基準陣列中符合條件的子集。

array_intersect_assoc() 以「鍵名+值」雙重嚴格比較,為配置審計、資料版本比對、API 回應驗證提供精準的交集語意保障。

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