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 示例
这展示了使用自定义比较函数对两个数组进行简单比较。
<?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 中。
使用自定义逻辑比较对象
使用自定义属性比较函数来比较对象数组。
<?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 中没有匹配的价格,因此两者都包含在结果中。
不区分大小写的字符串比较
执行不区分大小写的键和值比较
<?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 元素在数组之间存在差异。
多维数组比较
使用自定义比较逻辑比较多维数组。
<?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 中没有匹配的分数,因此两者都包含在结果中。
复杂自定义比较
实现结合多个因素的复杂比较逻辑。
<?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 数组函数。