ZetCode

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 示例

这展示了使用自定义值和键比较函数的简单交集。

basic_array_uintersect_uassoc.php
<?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" 同时出现在两个数组中。

比较对象

使用自定义回调函数按属性比较数组中的对象。

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", 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 产品仍包含在结果中。

复杂的键比较

为专门的交集需求实现高级键比较逻辑。

complex_key_comparison.php
<?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"。

多个数组比较

使用自定义比较函数比较两个以上的数组。

multiple_array_comparison.php
<?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 匹配。

自定义值比较逻辑

为专门的交集需求实现复杂的值比较逻辑。

custom_value_comparison.php
<?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 array_uintersect_uassoc 文档

本教程介绍了 PHP 的 array_uintersect_uassoc 函数,并通过实际示例展示了其在复杂数组交集中的用法。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面有十多年的经验。

列出 所有 PHP 数组函数