array_diff_uassoc(array $array, array ...$arrays): array
// 最後一個參數為 callable $key_compare_func
<?php
function cmp($a, $b) {
if ($a === $b) return 0;
return $a > $b ? 1 : -1;
}
$a1 = [0 => 'Dog', 1 => 'Cat', 2 => 'Horse'];
$a2 = [3 => 'Dog', 1 => 'Cat', 5 => 'Horse'];
$result = array_diff_uassoc($a1, $a2, 'cmp');
print_r($result);
/*
Array
(
[0] => Dog // 鍵 0 vs 3 不同
[2] => Horse // 鍵 2 vs 5 不同
)
// 索引 1 鍵名相同、值相同 → 排除
*/
$config1 = ['Host' => 'localhost', 'Port' => 3306, 'Debug' => true];
$config2 => ['host' => 'localhost', 'port' => 5432, 'debug' => true];
$cmp = fn($a, $b) => strcasecmp($a, $b);
$diff = array_diff_uassoc($config1, $config2, $cmp);
// ['Port' => 3306] ← 鍵名不分大小寫相同,但值 3306 != 5432
// Host、Debug 鍵名值皆同 → 排除
// 檢查版本並提供降級方案
if (version_compare(PHP_VERSION, '5.3.3', '<')) {
// 手動實作:遍歷 $array1,用自訂比較檢查是否存在於 $array2
function diff_uassoc_legacy(array $a1, array $a2, callable $cmp): array {
$res = [];
foreach ($a1 as $k1 => $v1) {
$found = false;
foreach ($a2 as $k2 => $v2) {
if ($cmp($k1, $k2) === 0 && $v1 == $v2) {
$found = true; break;
}
}
if (!$found) $res[$k1] = $v1;
}
return $res;
}
}
// 當需要「值」也用自訂邏輯比較 (如物件 ID 相等即同)
$diff = array_udiff_uassoc($a1, $a2,
fn($a, $b) => $a->id <=> $b->id, // 值比較
fn($a, $b) => $a <=> $b // 鍵比較
);
原文摘自 zuodefeng 筆記