ZetCode

PHP array_udiff_assoc 函数

最后修改于 2025 年 3 月 13 日

PHP 的 array_udiff_assoc 函数在进行数组差异计算时,会额外进行键名(索引)的检查。它使用回调函数来比较数据。

基本定义

array_udiff_assoc 在比较数组值的同时,还会检查键名。它返回 $array1 中存在但不在任何其他数组中的值。

语法:array_udiff_assoc(array $array1, array $array2, ..., callable $value_compare_func): array。回调函数应该返回一个小于零、等于零或大于零的整数。

基本的 array_udiff_assoc 示例

这显示了对两个数组进行简单的比较,同时检查值和键名。

basic_array_udiff_assoc.php
<?php

declare(strict_types=1);

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

$array1 = ["a" => 1, "b" => 2, "c" => 3];
$array2 = ["a" => 1, "b" => 5, "d" => 4];

$result = array_udiff_assoc($array1, $array2, 'compare_values');

print_r($result); 

这会同时根据键名和值来比较数组。只有键名和值都匹配的元素才会被视为相等。回调函数执行标准的比较。

比较对象

使用 array_udiff_assoc 来比较包含对象的数组。

object_comparison.php
<?php

declare(strict_types=1);

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

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

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

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

$diff = array_udiff_assoc($products1, $products2, 'compare_products');

print_r($diff); 

这会根据价格比较 Product 对象,同时检查数组键名。只有价格相同且键名匹配的产品才被认为是相同的。

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

在检查键名的同时,执行对字符串值的忽略大小写的比较。

case_insensitive.php
<?php

declare(strict_types=1);

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

$array1 = ["A" => "Apple", "B" => "Banana"];
$array2 = ["a" => "apple", "b" => "berry"];

$result = array_udiff_assoc($array1, $array2, 'case_insensitive_compare');

print_r($result); 

这在保持严格的键名比较的同时,对字符串值执行忽略大小写的比较。键名必须完全匹配,但值是进行不区分大小写的比较。

多个数组比较

通过键名和值检查,将一个数组与多个其他数组进行比较。

multiple_arrays.php
<?php

declare(strict_types=1);

function numeric_compare($a, $b): int {
    return $a - $b;
}

$main = ["x" => 10, "y" => 20, "z" => 30];
$array1 = ["x" => 10, "y" => 25];
$array2 = ["x" => 15, "z" => 30];

$diff = array_udiff_assoc($main, $array1, $array2, 'numeric_compare');

print_r($diff); 

这会找出 $main 中不存在于任何其他数组中的元素,同时比较键名和值。在这个例子中,只有 "y" => 20 满足这个条件。

复杂的自定义比较

为特殊的数组差异检查实现自定义的比较逻辑。

custom_comparison.php
<?php

declare(strict_types=1);

function complex_compare($a, $b): int {
    if (is_numeric($a) && is_numeric($b)) {
        return ($a > $b) ? 1 : (($a < $b) ? -1 : 0);
    }
    return strcmp((string)$a, (string)$b);
}

$array1 = ["a" => "10", "b" => 20, "c" => "30"];
$array2 = ["a" => 10, "b" => "20", "d" => 40];

$result = array_udiff_assoc($array1, $array2, 'complex_compare');

print_r($result);

这实现了一个自定义比较,可以处理数字字符串的不同。该函数将数字字符串和数字视为相等,如果它们的值匹配。

最佳实践

来源

PHP array_udiff_assoc 文档

本教程涵盖了 PHP array_udiff_assoc 函数,并通过实际示例展示了其在数组比较场景中的用法。

作者

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

列出 所有 PHP 数组函数