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

PHP array_diff_uassoc() 函式深度解析:自訂鍵名比較回調的差集運算實戰

     編輯:PHP 相關知識

array_diff_uassoc() 結合「鍵名+值」雙重比較,並允許開發者注入自訂回調函式決定鍵名相等邏輯,是處理複雜鍵名規則(如大小寫不敏感、數值近似、物件 ID 比對)的進階工具。

函式簽名與參數

array_diff_uassoc(array $array, array ...$arrays, callable $keyCompareFunc): array
參數必要性說明
$array必填基準陣列。
$arrays選填(可多個)比較陣列,可一次傳入多個。
$keyCompareFunc必填回調函式 func(mixed $key1, mixed $key2): int,回傳 < 0 / 0 / > 0 表示小於/等於/大於。

核心邏輯:雙重過濾機制

  1. 值比較:使用內建嚴格比較 ===(型別+值皆同)。
  2. 鍵名比較:委派給 $keyCompareFunc,回傳 0 視為「鍵名相同」。
  3. 保留條件:基準陣列中「值相同」且「鍵名經回調判定相同」的元素會被排除;其餘保留。

標準比較函式範本

<?php
// 數值/字串標準三向比較
function keyCompareStandard(mixed $a, mixed $b): int {
    if ($a === $b) return 0;
    return ($a > $b) ? 1 : -1;
}

// 大小寫不敏感字串比較
function keyCompareCaseInsensitive(string $a, string $b): int {
    return strcasecmp($a, $b);
}

// 數值近似比較(容差 0.01)
function keyCompareFloatTolerance(float $a, float $b): int {
    $diff = $a - $b;
    if (abs($diff) < 0.01) return 0;
    return ($diff > 0) ? 1 : -1;
}
?>

實戰範例解析

範例 1:基本數值鍵名差集

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

$result = array_diff_uassoc($a1, $a2, 'keyCompareStandard');
print_r($result);
// 輸出:
// Array (
//     [0] => Dog
//     [2] => Horse
// )
// 解析:
// 鍵 0 值 'Dog':$a2 無鍵 0 → 保留
// 鍵 1 值 'Cat':$a2 有鍵 1 且值同 → 排除
// 鍵 2 值 'Horse':$a2 無鍵 2 → 保留
// 鍵 3 值 'Dog':$a1 無此鍵 → 不在基準中
?>

範例 2:三陣列比較 + 自訂邏輯

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

// 使用標準比較
$result = array_diff_uassoc($a1, $a2, $a3, 'keyCompareStandard');
print_r($result);
// 輸出:
// Array (
//     [2] => Horse
// )
// 解析:
// 鍵 0 'Dog':$a3 有鍵 0 值同 → 排除
// 鍵 1 'Cat':$a2 有鍵 1 值同 → 排除
// 鍵 2 'Horse':$a2 鍵 5 值同但鍵名不同(2≠5) → 保留
// 鍵 5 'Horse':$a1 無鍵 5 → 不在基準
?>

範例 3:實戰場景 - API 回應欄位驗證(忽略鍵名大小寫)

<?php
$expected = ['UserID' => 100, 'Email' => 'test@example.com', 'Role' => 'admin'];
$actual   = ['userid' => 100, 'email' => 'test@example.com', 'role' => 'user', 'extra' => 'data'];

$missing = array_diff_uassoc($expected, $actual, 'keyCompareCaseInsensitive');
print_r($missing);
// 輸出:
// Array (
//     [Role] => admin
// )
// 解析:UserID/Email 鍵名忽略大小寫匹配且值同 → 排除
// Role 值不同 → 保留
// extra 不在基準 → 忽略
?>

與 array_diff_assoc() 關鍵差異

特性array_diff_assoc()array_diff_uassoc()
鍵名比較方式內建 ===(嚴格型別+值)自訂回調函式
彈性固定可實現大小寫不敏感、數值容差、物件屬性比對
效能較快(C 級內建)稍慢(PHP 回調開銷)

使用建議

  • 鍵名為標準純量型別且需嚴格匹配 → 用 array_diff_assoc()。
  • 鍵名含大小寫變體、浮點數近似、物件 ID、日期字串等非標準比較 → 用 array_diff_uassoc()。
  • 回調函式務必保持「自反性、對稱性、傳遞性」,否則結果不可預期。

善用自訂鍵名比較回調,讓陣列差集運算能精準適應業務層面的「相同」定義。

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