ZetCode

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 array_uintersect_assoc 函数,并提供了实际示例,展示了其在数组交集场景中的用法。

作者

我的名字是 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。 迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出 所有 PHP 数组函数