PHP array_intersect_ukey 函数
最后修改于 2025 年 3 月 13 日
PHP array_intersect_ukey 函数使用用户定义的比较函数,计算数组键名的交集。它对于复杂的键名比较非常有用。
基本定义
array_intersect_ukey 函数使用回调函数比较数组键名。它返回一个数组,其中包含第一个数组中所有存在于其他数组中的条目。
语法:array_intersect_ukey(array $array1, array $array2, ..., callable $key_compare_func): array。回调函数应返回一个小于零、等于零或大于零的整数。
基本的 array_intersect_ukey 示例
这显示了两个数组之间简单的、不区分大小写的键名比较。
<?php
declare(strict_types=1);
function keyCompare($key1, $key2): int {
return strcasecmp($key1, $key2);
}
$array1 = ["Name" => "Alice", "Age" => 25];
$array2 = ["name" => "Bob", "City" => "London"];
$result = array_intersect_ukey($array1, $array2, 'keyCompare');
print_r($result);
这会不区分大小写地比较键名。回调函数使用 strcasecmp 来匹配 "Name" 和 "name"。结果包含匹配的键值对。
数值键比较
使用自定义的浮点数容差比较数值键名。
<?php
declare(strict_types=1);
function floatKeyCompare($key1, $key2): int {
$epsilon = 0.00001;
$diff = abs($key1 - $key2);
if ($diff < $epsilon) {
return 0;
}
return ($key1 < $key2) ? -1 : 1;
}
$array1 = [1.00001 => "A", 2.5 => "B"];
$array2 = [1.0 => "X", 2.49999 => "Y"];
$result = array_intersect_ukey($array1, $array2, 'floatKeyCompare');
print_r($result);
这会以较小的容差比较浮点数键名。如果两个键名相差小于 0.00001,则回调函数认为它们相等。此示例中的两个键名都匹配。
多数组交集
使用自定义比较函数查找存在于三个数组中的键名。
<?php
declare(strict_types=1);
function lengthCompare($key1, $key2): int {
return strlen($key1) <=> strlen($key2);
}
$array1 = ["apple" => 1, "banana" => 2];
$array2 = ["orange" => 3, "kiwi" => 4];
$array3 = ["pear" => 5, "grape" => 6];
$result = array_intersect_ukey($array1, $array2, $array3, 'lengthCompare');
print_r($result);
这会根据长度匹配键名。只有 "apple"(5个字母)在所有数组中("orange" 和 "grape")有长度匹配的键名。回调函数使用太空船运算符进行比较。
对象键比较
使用基于属性的自定义比较来比较带有对象键名的数组。
<?php
declare(strict_types=1);
class ProductKey {
public function __construct(public string $id) {}
}
function productKeyCompare($key1, $key2): int {
return strcmp($key1->id, $key2->id);
}
$key1 = new ProductKey("P100");
$key2 = new ProductKey("P200");
$key3 = new ProductKey("P100");
$array1 = [$key1 => "Laptop", $key2 => "Phone"];
$array2 = [$key3 => "Tablet"];
$result = array_intersect_ukey($array1, $array2, 'productKeyCompare');
print_r($result);
这会根据 id 属性将对象作为键名进行比较。回调函数在 id 值上使用 strcmp。在此示例中,只有 P100 键在数组之间匹配。
复杂键名匹配
通过多个比较标准实现高级键名匹配。
<?php
declare(strict_types=1);
function complexKeyCompare($key1, $key2): int {
$score = 0;
$score += strcasecmp(substr($key1, 0, 3), substr($key2, 0, 3));
$score += (strlen($key1) <=> strlen($key2)) * 2;
return $score;
}
$array1 = ["user_123" => "Alice", "admin_45" => "Bob"];
$array2 = ["USER_123" => "Active", "guest_78" => "Inactive"];
$result = array_intersect_ukey($array1, $array2, 'complexKeyCompare');
print_r($result);
这实现了多因素键名比较。它不区分大小写地匹配前 3 个字符,并考虑键名长度。尽管第二个数组中存在大小写差异,但 "user_123" 键名仍然匹配。
最佳实践
- 一致的返回值:确保回调始终返回整数。
- 性能:对于大型数组,请保持比较逻辑的高效性。
- 类型安全:为回调参数添加类型提示。
- 文档:清晰地记录自定义比较规则。
来源
本教程介绍了 PHP array_intersect_ukey 函数,并通过实际示例展示了其在复杂键名比较场景中的用法。
作者
列出 所有 PHP 数组函数。