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 数组函数。