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 数组函数。