PHP array_uintersect_uassoc 函数
最后修改于 2025 年 3 月 13 日
PHP 的 array_uintersect_uassoc 函数计算数组的交集,并带有额外的键检查和自定义比较函数。它对于复杂的数组比较非常有用。
基本定义
array_uintersect_uassoc 函数使用两个回调函数来比较数组。一个用于值比较,一个用于键比较。
语法:array_uintersect_uassoc(array $array1, array $array2, ..., callable $value_compare_func, callable $key_compare_func): array。它返回一个包含所有参数中都存在的数组。
基本的 array_uintersect_uassoc 示例
这展示了使用自定义值和键比较函数的简单交集。
<?php
declare(strict_types=1);
$array1 = ["a" => "green", "b" => "brown", "c" => "blue"];
$array2 = ["a" => "GREEN", "B" => "brown", "yellow"];
$result = array_uintersect_uassoc(
$array1,
$array2,
fn($a, $b) => strcasecmp($a, $b), // Case-insensitive value compare
fn($a, $b) => strcasecmp($a, $b) // Case-insensitive key compare
);
print_r($result);
这使用不区分大小写的比较来查找值和键的交集。只有键为 "a" 的 "green"/"GREEN" 同时出现在两个数组中。
比较对象
使用自定义回调函数按属性比较数组中的对象。
<?php
declare(strict_types=1);
class Product {
public function __construct(
public string $name,
public float $price
) {}
}
$products1 = [
"p1" => new Product("Laptop", 999.99),
"p2" => new Product("Phone", 699.99)
];
$products2 = [
"P1" => new Product("Laptop", 999.99),
"p3" => new Product("Tablet", 399.99)
];
$result = array_uintersect_uassoc(
$products1,
$products2,
fn($a, $b) => $a->name <=> $b->name, // Compare by name
fn($a, $b) => strcasecmp($a, $b) // Case-insensitive key compare
);
print_r($result);
这查找具有相同名称的产品,忽略键的大小写。尽管键的大小写不同("p1" vs "P1"),Laptop 产品仍包含在结果中。
复杂的键比较
为专门的交集需求实现高级键比较逻辑。
<?php
declare(strict_types=1);
$array1 = ["user_1" => "Alice", "user_2" => "Bob", "admin" => "Charlie"];
$array2 = ["USER-1" => "Alice", "guest" => "Dave", "ADMIN" => "Charlie"];
$result = array_uintersect_uassoc(
$array1,
$array2,
fn($a, $b) => strcmp($a, $b), // Standard value comparison
function($a, $b) { // Custom key comparison
$normalize = fn($k) => strtolower(str_replace(['_', '-'], '', $k));
return strcmp($normalize($a), $normalize($b));
}
);
print_r($result);
这通过删除下划线/连字符并忽略大小写来进行键的规范化,然后再进行比较。匹配 "user_1" 和 "USER-1",以及 "admin" 和 "ADMIN"。
多个数组比较
使用自定义比较函数比较两个以上的数组。
<?php
declare(strict_types=1);
$array1 = ["A" => 1, "B" => 2, "C" => 3];
$array2 = ["a" => 1, "b" => 4, "c" => 3];
$array3 = ["A" => 1, "B" => 5, "C" => 3];
$result = array_uintersect_uassoc(
$array1,
$array2,
$array3,
fn($a, $b) => $a <=> $b, // Numeric value comparison
fn($a, $b) => strcasecmp($a, $b) // Case-insensitive key comparison
);
print_r($result);
这查找三个数组中值相同且键不区分大小写的条目。只有键 "A"/"a" 和 "C"/"c" 与值 1 和 3 匹配。
自定义值比较逻辑
为专门的交集需求实现复杂的值比较逻辑。
<?php
declare(strict_types=1);
$array1 = ["id1" => ["name" => "Alice", "score" => 85], "id2" => ["name" => "Bob", "score" => 90]];
$array2 = ["ID1" => ["name" => "Alice", "score" => 85], "id3" => ["name" => "Charlie", "score" => 95]];
$result = array_uintersect_uassoc(
$array1,
$array2,
function($a, $b) { // Compare associative arrays
return $a["name"] <=> $b["name"] ?: $a["score"] <=> $b["score"];
},
fn($a, $b) => strcasecmp($a, $b) // Case-insensitive key comparison
);
print_r($result);
这通过姓名和分数来比较嵌套数组,同时不区分大小写地匹配键。只有 Alice 的记录在两个数组中具有相同的详细信息。
最佳实践
- 一致的比较:确保比较函数是传递性的。
- 性能:优化大型数组的回调函数。
- 类型安全:为 PHP 8+ 的回调函数添加类型提示。
- 可读性:对复杂的逻辑使用命名函数。
- 测试:验证比较函数中的边缘情况。
来源
PHP array_uintersect_uassoc 文档
本教程介绍了 PHP 的 array_uintersect_uassoc 函数,并通过实际示例展示了其在复杂数组交集中的用法。
作者
列出 所有 PHP 数组函数。