ZetCode

PHP array_udiff_uassoc 函数

最后修改于 2025 年 3 月 13 日

PHP array_udiff_uassoc 函数计算数组之间的差异,并进行额外的索引检查,同时使用回调函数进行数据和索引比较。它对于复杂的数组比较非常有用。

基本定义

array_udiff_uassoc 函数通过值和键来比较数组。它使用两个回调函数——一个用于值比较,另一个用于键比较。

语法:array_udiff_uassoc(array $array1, array $array2, ..., callable $value_compare_func, callable $key_compare_func): array。返回 array1 中不存在于其他数组中的值。

基本的 array_udiff_uassoc 示例

这展示了使用自定义比较函数对两个数组进行简单比较。

basic_array_udiff_uassoc.php
<?php

declare(strict_types=1);

function compareValues($a, $b): int {
    return $a <=> $b;
}

function compareKeys($a, $b): int {
    return strcasecmp($a, $b);
}

$array1 = ["a" => 1, "b" => 2, "c" => 3];
$array2 = ["A" => 1, "B" => 5, "C" => 3];

$result = array_udiff_uassoc($array1, $array2, 'compareValues', 'compareKeys');

print_r($result); 

此示例将键进行不区分大小写的比较,值进行普通比较。只有键为“b”且值为 2 的元素存在于 array1 中但不在 array2 中。

使用自定义逻辑比较对象

使用自定义属性比较函数来比较对象数组。

object_comparison.php
<?php

declare(strict_types=1);

class Product {
    public function __construct(
        public string $name,
        public float $price
    ) {}
}

function compareProducts($a, $b): int {
    return $a->price <=> $b->price;
}

function compareKeys($a, $b): int {
    return strcmp($a, $b);
}

$products1 = [
    "p1" => new Product("Laptop", 999.99),
    "p2" => new Product("Phone", 699.99)
];

$products2 = [
    "p1" => new Product("Tablet", 399.99),
    "p3" => new Product("Monitor", 299.99)
];

$result = array_udiff_uassoc($products1, $products2, 'compareProducts', 'compareKeys');

print_r($result); // Outputs both products from $products1

此示例按价格和键进行普通比较。由于 array1 中的产品在 array2 中没有匹配的价格,因此两者都包含在结果中。

不区分大小写的字符串比较

执行不区分大小写的键和值比较

case_insensitive.php
<?php

declare(strict_types=1);

function compareValues($a, $b): int {
    return strcasecmp($a, $b);
}

function compareKeys($a, $b): int {
    return strcasecmp($a, $b);
}

$array1 = ["Name" => "John", "Age" => "30"];
$array2 = ["name" => "JOHN", "age" => "25"];

$result = array_udiff_uassoc($array1, $array2, 'compareValues', 'compareKeys');

print_r($result); 

此示例对键和值都执行不区分大小写的比较。以这种方式比较时,只有 Age 元素在数组之间存在差异。

多维数组比较

使用自定义比较逻辑比较多维数组。

multi_dimensional.php
<?php

declare(strict_types=1);

function compareValues($a, $b): int {
    return $a['score'] <=> $b['score'];
}

function compareKeys($a, $b): int {
    return $a <=> $b;
}

$students1 = [
    101 => ['name' => 'Alice', 'score' => 85],
    102 => ['name' => 'Bob', 'score' => 90]
];

$students2 = [
    101 => ['name' => 'Alice', 'score' => 80],
    103 => ['name' => 'Charlie', 'score' => 95]
];

$result = array_udiff_uassoc($students1, $students2, 'compareValues', 'compareKeys');

print_r($result); // Outputs both students from $students1

此示例通过分数(score)值比较学生记录。由于 array1 中的学生在 array2 中没有匹配的分数,因此两者都包含在结果中。

复杂自定义比较

实现结合多个因素的复杂比较逻辑。

complex_comparison.php
<?php

declare(strict_types=1);

function compareValues($a, $b): int {
    $scoreA = $a['points'] * $a['multiplier'];
    $scoreB = $b['points'] * $b['multiplier'];
    return $scoreA <=> $scoreB;
}

function compareKeys($a, $b): int {
    return strlen($a) <=> strlen($b);
}

$data1 = [
    "user1" => ['points' => 10, 'multiplier' => 2],
    "longuser" => ['points' => 5, 'multiplier' => 3]
];

$data2 = [
    "usr" => ['points' => 10, 'multiplier' => 2],
    "user" => ['points' => 5, 'multiplier' => 4]
];

$result = array_udiff_uassoc($data1, $data2, 'compareValues', 'compareKeys');

print_r($result); 

此示例通过计算分数(points * multiplier)比较数据,并通过长度比较键。以这种方式比较时,只有第一个元素存在差异。

最佳实践

来源

PHP array_udiff_uassoc 文档

本教程介绍了 PHP array_udiff_uassoc 函数,并通过实际示例展示了其在复杂数组比较中的用法。

作者

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

列出 所有 PHP 数组函数