PHP array_uintersect_assoc 函数
最后修改于 2025 年 3 月 13 日
PHP array_uintersect_assoc 函数计算数组的交集,并额外检查索引,通过回调函数比较数据。
基本定义
array_uintersect_assoc 返回一个数组,该数组包含来自 array1 中所有在所有参数中都存在的值。 键用于比较。
语法:array_uintersect_assoc(array $array1, array $array2, ..., callable $value_compare_func): array。 回调函数必须返回一个小于、等于或大于零的整数。
基本的 array_uintersect_assoc 示例
此示例显示了一个简单的、不区分大小写的字符串比较交集。
basic_array_uintersect_assoc.php
<?php declare(strict_types=1); $array1 = ["a" => "green", "b" => "brown", "c" => "blue"]; $array2 = ["a" => "GREEN", "B" => "yellow", "c" => "BLUE"]; $result = array_uintersect_assoc($array1, $array2, "strcasecmp"); print_r($result);
这使用 strcasecmp 不区分大小写地比较数组。 仅包含具有匹配键 AND 不区分大小写的值的元素。
自定义对象比较
使用自定义回调函数比较对象数组以进行交集运算。
object_comparison.php
<?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", 899.99),
"p3" => new Product("Tablet", 399.99)
];
$result = array_uintersect_assoc($products1, $products2,
fn($a, $b) => $a->name <=> $b->name);
print_r($result);
这会交叉 Product 对象数组,仅比较 name 属性。 相同的键("p1")和匹配的名称将包含在输出中。
具有精度的数值比较
在交集中比较具有精度容差的浮点数。
float_comparison.php
<?php
declare(strict_types=1);
$array1 = ["a" => 1.2345, "b" => 2.3456, "c" => 3.4567];
$array2 = ["a" => 1.2346, "b" => 2.3450, "d" => 3.4567];
$result = array_uintersect_assoc($array1, $array2, function($a, $b) {
return abs($a - $b) < 0.001 ? 0 : ($a <=> $b);
});
print_r($result);
这以 0.001 的精度容差比较浮点数。 键必须完全匹配,而值被认为在指定的容差范围内是相等的。
多数组交集
使用自定义比较函数计算多个数组的交集。
multi_array_intersection.php
<?php declare(strict_types=1); $array1 = ["a" => "apple", "b" => "banana", "c" => "cherry"]; $array2 = ["a" => "APPLE", "c" => "CHERRY", "d" => "date"]; $array3 = ["a" => "Apple", "c" => "Cherry", "e" => "elderberry"]; $result = array_uintersect_assoc($array1, $array2, $array3, "strcasecmp"); print_r($result);
这会找到所有三个数组中都存在的元素,这些元素的键匹配且值不区分大小写地匹配,使用 strcasecmp。
复杂数据结构比较
使用自定义回调比较包含复杂数据结构的数组。
complex_comparison.php
<?php
declare(strict_types=1);
$array1 = [
"user1" => ["id" => 1, "name" => "John"],
"user2" => ["id" => 2, "name" => "Jane"]
];
$array2 = [
"user1" => ["id" => 1, "name" => "JOHN"],
"user3" => ["id" => 3, "name" => "Alice"]
];
$result = array_uintersect_assoc($array1, $array2, function($a, $b) {
return $a["id"] <=> $b["id"];
});
print_r($result);
这会交叉关联数组的数组,仅比较 "id" 字段。 键 "user1" 匹配,且 id 值相等,因此被包含。
最佳实践
- 一致的回调函数: 确保回调函数返回正确的比较值。
- 键的感知: 记住键和值都会被比较。
- 性能: 对于大型数组,优化回调函数。
- 类型安全: 在回调中添加类型提示以增强稳健性。
来源
本教程介绍了 PHP array_uintersect_assoc 函数,并提供了实际示例,展示了其在数组交集场景中的用法。
作者
列出 所有 PHP 数组函数。