array_intersect_uassoc(array $array, array ...$arrays): array
// 最後一個參數為 callable $key_compare_func
<?php
$arr1 = ['Blue' => 6, 'Red' => 2, 'Green' => 3, 'Purple' => 4];
$arr2 = ['green' => 5, 'BLUE' => 6, 'Yellow' => 7, 'Cyan' => 8];
// strcasecmp 不分大小寫比較鍵名
$result = array_intersect_uassoc($arr1, $arr2, 'strcasecmp');
print_r($result);
/*
Array
(
[Blue] => 6 // 鍵名 'Blue'=='BLUE' 且值 6==6
)
// Green 值 3!=5 故不包含
*/
$arr1 = ['Blue' => 6, 'Red' => 2];
$arr2 => ['blue' => 6, 'red' => 2];
var_dump(array_intersect_assoc($arr1, $arr2)); // [] 區分大小寫
var_dump(array_intersect_uassoc($arr1, $arr2, 'strcasecmp')); // 兩者皆符合
$users1 = [
'U001' => ['name' => 'Alice', 'role' => 'admin'],
'U002' => ['name' => 'Bob', 'role' => 'user'],
];
$users2 = [
'u001' => ['name' => 'Alice', 'role' => 'admin'],
'u003' => ['name' => 'Charlie', 'role' => 'user'],
];
// 比較鍵名不分大小寫,值陣列需完全相同 (鬆散比較逐元素)
$cmp = fn($a, $b) => strcasecmp($a, $b);
$common = array_intersect_uassoc($users1, $users2, $cmp);
// ['U001' => ['name'=>'Alice','role'=>'admin']]
| 需求 | 可行方案 |
|---|---|
| 自訂「值」比較邏輯 (如物件 ID 相等即同) | `array_uintersect_assoc` (PHP 5+) |
| 同時自訂鍵與值比較 | `array_uintersect_uassoc` (PHP 5+) |
| 嚴格型別比較 (`===`) | 自行迴圈或 `array_filter` + `array_intersect_key` |
原文摘自 zuodefeng 筆記