ZetCode

PHP array_intersect_uassoc 函数

最后修改于 2025 年 3 月 13 日

PHP array_intersect_uassoc 函数计算数组的交叉,并进行附加的索引检查。它使用回调函数比较键。

基本定义

array_intersect_uassoc 返回一个数组,其中包含第一个数组中存在于所有其他数组中的所有值。键使用用户提供的回调函数进行比较。

语法: array_intersect_uassoc(array $array1, array $array2, ..., callable $key_compare_func): array。回调函数应返回一个小于、等于或大于零的整数。

基本的 array_intersect_uassoc 示例

此示例显示了如何查找具有不区分大小写键比较的数组的交叉。

basic_array_intersect_uassoc.php
<?php

declare(strict_types=1);

$array1 = ["a" => "apple", "B" => "banana", "c" => "cherry"];
$array2 = ["A" => "apple", "b" => "banana", "C" => "cherry"];

$result = array_intersect_uassoc($array1, $array2, function($a, $b) {
    return strcasecmp($a, $b);
});

print_r($result);

这会查找键不区分大小写匹配的两个数组中都存在的元素。回调使用 strcasecmp 进行不区分大小写的比较。

数值键比较

使用自定义逻辑比较数字键以查找匹配的元素。

numeric_key_comparison.php
<?php

declare(strict_types=1);

$array1 = [1 => "one", 2 => "two", 3 => "three"];
$array2 = ["1" => "one", "2" => "two", 4 => "four"];

$result = array_intersect_uassoc($array1, $array2, function($a, $b) {
    return $a <=> $b;
});

print_r($result);

这会松散地比较数字键(字符串与整数)。宇宙飞船运算符 (<=>) 处理比较,匹配键 1 和 2。

复杂的键比较

使用更复杂的回调函数来比较复合键。

complex_key_comparison.php
<?php

declare(strict_types=1);

$array1 = ["user_1" => "Alice", "user_2" => "Bob", "admin_1" => "Charlie"];
$array2 = ["USER_1" => "Alice", "user_3" => "Dave", "ADMIN_1" => "Charlie"];

$result = array_intersect_uassoc($array1, $array2, function($a, $b) {
    $aParts = explode('_', strtolower($a));
    $bParts = explode('_', strtolower($b));
    
    if ($aParts[0] !== $bParts[0]) return $aParts[0] <=> $bParts[0];
    return $aParts[1] <=> $bParts[1];
});

print_r($result);

此方法通过将键分解为部分并单独比较每个部分来进行比较。回调函数首先规范化大小写,然后分别比较类型和 ID。

多个数组比较

使用自定义键比较逻辑比较两个以上的数组。

multiple_array_comparison.php
<?php

declare(strict_types=1);

$array1 = ["a" => "apple", "b" => "banana", "c" => "cherry"];
$array2 = ["A" => "apple", "B" => "banana", "D" => "date"];
$array3 = ["a" => "apple", "b" => "blueberry", "c" => "cherry"];

$result = array_intersect_uassoc($array1, $array2, $array3, function($a, $b) {
    return strcasecmp($a, $b);
});

print_r($result);

这会查找所有三个数组中都存在的、键不区分大小写匹配的元素。只有键为“a”的“apple”存在于所有数组中。

对象键比较

使用自定义比较函数比较带有对象键的数组。

object_key_comparison.php
<?php

declare(strict_types=1);

class User {
    public function __construct(public int $id) {}
}

$user1 = new User(1);
$user2 = new User(2);
$user3 = new User(1);

$array1 = [$user1 => "Alice", $user2 => "Bob"];
$array2 = [$user3 => "Alice", $user2 => "Charlie"];

$result = array_intersect_uassoc($array1, $array2, function($a, $b) {
    return $a->id <=> $b->id;
});

print_r($result);

此方法通过 ID 属性将对象作为键进行比较。回调使用宇宙飞船运算符比较 ID,从而匹配两个数组中的 User 1。

最佳实践

来源

PHP array_intersect_uassoc 文档

本教程介绍了 PHP array_intersect_uassoc 函数,并通过实际示例展示了其在带有自定义键比较的数组交叉中的用法。

作者

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

列出 所有 PHP 数组函数