ZetCode

PHP array_diff_uassoc 函数

最后修改于 2025 年 3 月 13 日

PHP array_diff_uassoc 函数计算数组的差异,并附加索引检查。 它使用用户定义的 回调函数 比较键和值。

基本定义

array_diff_uassoc 函数比较数组并返回差异。它检查键和值,使用回调进行键比较。

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

array_diff_uassoc 基础示例

此示例演示了使用自定义键比较对两个数组的简单比较。

basic_array_diff_uassoc.php
<?php

function key_compare($a, $b) {
    if ($a === $b) {
        return 0;
    }
    return ($a > $b) ? 1 : -1;
}

$array1 = ["a" => "red", "b" => "green", "c" => "blue"];
$array2 = ["a" => "red", "d" => "green"];

$result = array_diff_uassoc($array1, $array2, "key_compare");

print_r($result);

这使用自定义键比较函数比较两个数组。输出显示来自 $array1 但在 $array2 中不存在的元素,同时考虑键和值。

不区分大小写的键比较

此示例演示了数组之间不区分大小写的键比较。

case_insensitive.php
<?php

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

$array1 = ["A" => "apple", "B" => "banana", "C" => "cherry"];
$array2 = ["a" => "apple", "b" => "berry"];

$result = array_diff_uassoc($array1, $array2, "case_insensitive_compare");

print_r($result);

回调使用 strcasecmp 进行不区分大小写的比较。 结果中仅返回具有不同不区分大小写键或不同值的元素。

比较多个数组

此示例演示了如何使用 array_diff_uassoc 比较两个以上的数组。

multiple_arrays.php
<?php

function numeric_compare($a, $b) {
    return $a <=> $b;
}

$array1 = [10 => "ten", 20 => "twenty", 30 => "thirty"];
$array2 = [10 => "ten", 20 => "twentyone"];
$array3 = [10 => "ten", 30 => "thirtytwo"];

$result = array_diff_uassoc($array1, $array2, $array3, "numeric_compare");

print_r($result);

该函数将所有数组与第一个数组进行比较。 仅返回在任何其他数组中都不存在的元素(考虑键和值)。 太空船运算符简化了比较。

复杂的键比较

此示例演示了更复杂的键比较逻辑。

complex_comparison.php
<?php

function complex_compare($a, $b) {
    // Compare string length first, then alphabetical order
    $len1 = strlen($a);
    $len2 = strlen($b);
    
    if ($len1 != $len2) {
        return $len1 <=> $len2;
    }
    return strcmp($a, $b);
}

$array1 = ["apple" => 1, "banana" => 2, "cherry" => 3];
$array2 = ["apple" => 1, "berry" => 4, "cherry" => 5];

$result = array_diff_uassoc($array1, $array2, "complex_compare");

print_r($result);

回调首先比较键长度,然后比较字母顺序。 这展示了如何为数组键实现多标准比较逻辑。

对象键比较

此高级示例使用 array_diff_uassoc 比较具有对象键的数组。

object_keys.php
<?php

class ProductKey {
    public function __construct(public string $id) {}
}

function object_compare($a, $b) {
    return strcmp($a->id, $b->id);
}

$key1 = new ProductKey("p1");
$key2 = new ProductKey("p2");
$key3 = new ProductKey("p3");

$array1 = [$key1 => "Laptop", $key2 => "Phone"];
$array2 = [$key1 => "Laptop", $key3 => "Tablet"];

$result = array_diff_uassoc($array1, $array2, "object_compare");

print_r($result);

这演示了如何比较具有对象键的数组。 回调根据其 id 属性比较对象。 仅返回 Phone 条目,因为它在 $array2 中不存在,且具有相同的键和值。

最佳实践

来源

PHP array_diff_uassoc 文档

本教程介绍了 PHP array_diff_uassoc 函数,并提供了实际示例,展示了它在数组比较场景中的用法。

作者

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

列出 所有 PHP 数组函数