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