array_diff_ukey() 專注於「鍵名」單一維度比較,並支援自訂回調函式定義鍵名相等邏輯。適用於鍵名為複雜型別(物件、日期字串、浮點數)或需特定排序規則(自然排序、版本號比較)的差集運算場景。
array_diff_ukey(array $array, array ...$arrays, callable $keyCompareFunc): array
| 參數 | 必要性 | 說明 |
|---|---|---|
$array | 必填 | 基準陣列,僅其鍵名參與比較。 |
$arrays | 選填(可多個) | 一個或多個比較陣列。 |
$keyCompareFunc | 必填 | 回調 func(mixed $key1, mixed $key2): int,回傳負/零/正 代表 小於/等於/大於。 |
<?php
$a1 = [0 => 'Dog', 1 => 'Cat', 2 => 'Horse'];
$a2 = [3 => 'Rat', 1 => 'Bird', 5 => 'Monkey'];
$result = array_diff_ukey($a1, $a2, 'keyCompareStandard');
print_r($result);
// 輸出:
// Array (
// [0] => Dog
// [2] => Horse
// )
// 解析:鍵 1 存在於 $a2 → 排除;鍵 0、2 僅在 $a1 → 保留
?>
<?php
$a1 = [0 => 'Dog', 1 => 'Cat', 2 => 'Horse'];
$a2 = [3 => 'Rat', 1 => 'Bird', 5 => 'Monkey'];
$a3 = [6 => 'Dog', 7 => 'Donkey', 0 => 'Horse'];
$result = array_diff_ukey($a1, $a2, $a3, 'keyCompareStandard');
print_r($result);
// 輸出:
// Array (
// [2] => Horse
// )
// 解析:
// 鍵 0:$a3 有鍵 0 → 排除
// 鍵 1:$a2 有鍵 1 → 排除
// 鍵 2:$a2、$a3 均無鍵 2 → 保留
?>
<?php
$installed = [
'1.0.0' => 'core',
'1.2.3' => 'module-a',
'2.0.0-beta' => 'module-b',
'2.0.0' => 'module-c'
];
$available = [
'1.0.0' => 'core',
'1.2.3' => 'module-a',
'2.0.0' => 'module-c',
'2.1.0' => 'module-d'
];
// 版本號感知比較(需 PHP 8.0+ strnatcmp 或 version_compare 封裝)
function versionKeyCompare(string $a, string $b): int {
return version_compare($a, $b);
}
$missing = array_diff_ukey($available, $installed, 'versionKeyCompare');
print_r($missing);
// 輸出:
// Array (
// [2.1.0] => module-d
// )
// 應用:發現可用但未安裝的版本
?>
<?php
$schedule1 = [
new DateTime('2024-01-01 09:00') => 'Meeting A',
new DateTime('2024-01-01 14:00') => 'Meeting B',
];
$schedule2 = [
new DateTime('2024-01-01 09:00') => 'Meeting A (updated)',
new DateTime('2024-01-02 09:00') => 'Meeting C',
];
function dateTimeKeyCompare(DateTime $a, DateTime $b): int {
return $a <=> $b; // PHP 7.0+ 太空船運算子
}
$unique = array_diff_ukey($schedule1, $schedule2, 'dateTimeKeyCompare');
print_r($unique);
// 輸出:僅保留 2024-01-01 14:00 的 Meeting B
?>
| 函式 | 比較維度 | 自訂比較 | 典型用途 |
|---|---|---|---|
array_diff_key() | 鍵名(內建 ===) | ❌ | 標準鍵名差集 |
array_diff_ukey() | 鍵名(自訂回調) | ✅ | 版本號、日期、物件鍵名 |
array_diff_assoc() | 鍵名+值(內建 ===) | ❌ | 精確鍵值對差集 |
array_diff_uassoc() | 鍵名(自訂)+值(內建) | ✅(鍵名) | 複雜鍵名+值雙重驗證 |
cmp(a,b) === -cmp(b,a) 且傳遞性成立,否則排序/比較行為未定義。fn($a,$b) => $a <=> $b 簡化標準三向比較回調。array_diff_ukey() 讓鍵名差集運算突破型別限制,是處理版本管理、時序資料、物件索引等進階場景的關鍵工具。