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 表示小於/等於/大於。 |
===(型別+值皆同)。$keyCompareFunc,回傳 0 視為「鍵名相同」。<?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;
}
?>
<?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 無此鍵 → 不在基準中
?>
<?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 → 不在基準
?>
<?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_uassoc() |
|---|---|---|
| 鍵名比較方式 | 內建 ===(嚴格型別+值) | 自訂回調函式 |
| 彈性 | 固定 | 可實現大小寫不敏感、數值容差、物件屬性比對 |
| 效能 | 較快(C 級內建) | 稍慢(PHP 回調開銷) |
array_diff_assoc()。array_diff_uassoc()。善用自訂鍵名比較回調,讓陣列差集運算能精準適應業務層面的「相同」定義。