ZetCode

PHP array_udiff 函数

最后修改于 2025 年 3 月 13 日

PHP array_udiff 函数使用回调函数进行数据比较来计算数组之间的差集。它对于自定义比较非常有用。

基本定义

array_udiff 函数使用回调函数比较数组值。它返回第一个数组中不存在于其他数组中的值。

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

基本的 array_udiff 示例

这显示了一个使用回调函数比较包含数字的数组的简单示例。

basic_array_udiff.php
<?php

declare(strict_types=1);

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

$array1 = [1, 2, 3, 4, 5];
$array2 = [3, 4, 5, 6, 7];

$result = array_udiff($array1, $array2, 'compareNumbers');

print_r($result); 

这会找出 $array1 中不存在于 $array2 中的元素。回调函数使用 spaceship 运算符进行比较。结果包含值 1 和 2。

比较对象

根据特定的对象属性比较对象数组。

object_comparison.php
<?php

declare(strict_types=1);

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

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

$products1 = [
    new Product("Laptop", 999.99),
    new Product("Phone", 699.99),
    new Product("Tablet", 399.99)
];

$products2 = [
    new Product("Monitor", 299.99),
    new Product("Keyboard", 99.99),
    new Product("Phone", 699.99)
];

$result = array_udiff($products1, $products2, 'compareProducts');

foreach ($result as $product) {
    echo $product->name . "\n"; 
}

这会按价格比较产品。回调函数会检查 price 属性。返回第一个数组中价格唯一的那些产品。

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

对字符串数组执行不区分大小写的比较。

case_insensitive.php
<?php

declare(strict_types=1);

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

$array1 = ["Apple", "Banana", "Cherry"];
$array2 = ["apple", "banana", "grape"];

$result = array_udiff($array1, $array2, 'compareStrings');

print_r($result); 

这会忽略大小写比较字符串。回调函数使用 strcasecmp。只有 "Cherry" 是不同的,因为其他字符串在不区分大小写的情况下匹配。

多维数组比较

根据特定元素比较多维数组。

multi_dimensional.php
<?php

declare(strict_types=1);

function compareArrays(array $a, array $b): int {
    return $a['id'] <=> $b['id'];
}

$users1 = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob'],
    ['id' => 3, 'name' => 'Charlie']
];

$users2 = [
    ['id' => 2, 'name' => 'Robert'],
    ['id' => 4, 'name' => 'David']
];

$result = array_udiff($users1, $users2, 'compareArrays');

print_r($result); // Outputs users with IDs 1 and 3

这会根据 'id' 元素比较数组。回调函数会检查 id 键。返回第一个数组中 ID 唯一的那些用户。

多个数组比较

同时将一个数组与多个其他数组进行比较。

multiple_arrays.php
<?php

declare(strict_types=1);

function compareValues($a, $b): int {
    if (is_numeric($a) && is_numeric($b)) {
        return $a <=> $b;
    }
    return strcmp((string)$a, (string)$b);
}

$mainArray = [1, 'apple', 3.14, true, 'orange'];
$array2 = [1, 3.14];
$array3 = ['apple', 'banana'];

$result = array_udiff($mainArray, $array2, $array3, 'compareValues');

print_r($result); 

这会与包含混合类型的多个数组进行比较。回调函数同时处理数值和字符串比较。只保留唯一的值。

最佳实践

来源

PHP array_udiff 文档

本教程介绍了 PHP array_udiff 函数,并通过实际示例展示了它在各种比较场景中的用法。

作者

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

列出 所有 PHP 数组函数