ZetCode

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

这显示了两个数组之间简单的、不区分大小写的键名比较。

basic_array_intersect_ukey.php
<?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"。结果包含匹配的键值对。

数值键比较

使用自定义的浮点数容差比较数值键名。

numeric_key_comparison.php
<?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,则回调函数认为它们相等。此示例中的两个键名都匹配。

多数组交集

使用自定义比较函数查找存在于三个数组中的键名。

multi_array_intersection.php
<?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")有长度匹配的键名。回调函数使用太空船运算符进行比较。

对象键比较

使用基于属性的自定义比较来比较带有对象键名的数组。

object_key_comparison.php
<?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 键在数组之间匹配。

复杂键名匹配

通过多个比较标准实现高级键名匹配。

complex_key_matching.php
<?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 array_intersect_ukey 函数,并通过实际示例展示了其在复杂键名比较场景中的用法。

作者

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

列出 所有 PHP 数组函数