相信 PHP 的维护者已经进行了优化array_udiff()
,以超越所有其他可以做到这一点的技术。
对于您的方案,您正在寻求一种过滤array_diff()
来评估第一级“值”(数据行)内的数据。在自定义函数中,必须隔离特定列以进行比较。有关所有本机array_diff()
函数变体的列表,请参阅此答案。
要使用第一个数组过滤第二个数组(并从第二个数组输出保留的数据),您必须写$array2
为第一个参数和$array1
第二个参数。
array_diff()
和array_intersect()
利用(包含u
在它们的函数名称中)的函数期望一个整数作为它们的返回值。 该值用于在实际执行评估之前对数据进行初步排序——这是一种性能优化。在某些情况下,如果您只返回0
或1
(不是三向比较),那么结果可能会出乎意料。为确保结果稳定,请始终提供可以返回负数、正数和零整数的比较函数。
比较整数值时,减法 ( $a - $b
) 将给出可靠的返回值。为了在比较浮点值或非数字数据时获得更大的实用性,您可以在您的 PHP 版本可用时使用 spaceship 运算符。
代码:(演示)
PHP7.4+(箭头函数)
var_export(
array_udiff($array2, $array1, fn($a, $b) => $a['ITEM'] <=> $b['ITEM'])
);
PHP7+(宇宙飞船操作员)
var_export(
array_udiff(
$array2,
$array1,
function($a, $b) {
return $a['ITEM'] <=> $b['ITEM'];
}
)
);
PHP5.3+(匿名函数)
var_export(
array_udiff(
$array2,
$array1,
function($a, $b) {
return $a['ITEM'] === $b['ITEM']
? 0
: ($a['ITEM'] > $b['ITEM'] ? 1 : -1);
}
)
);
以上所有版本的输出:
array (
3 =>
array (
'ITEM' => 4,
),
)
使用对象数组时,技术是相同的;只有访问属性的语法不同于访问数组元素($a['ITEM']
将是$a->ITEM
)。
对于与一个数组隔离的元素在另一个数组中不存在的情况,您需要将两者$a
和$b
数据合并到相反的备用列,因为来自第一个数组和第二个数组的数据将在打回来。
代码:(演示)
$array1 = array(
array('ITEM' => 1),
array('ITEM' => 2),
array('ITEM' => 3),
);
$array2 = array(
array('ITEMID' => 2),
array('ITEMID' => 3),
array('ITEMID' => 1),
array('ITEMID' => 4),
);
// PHP7.4+ (arrow functions)
var_export(
array_udiff(
$array2,
$array1,
fn($a, $b) => ($a['ITEM'] ?? $a['ITEMID']) <=> ($b['ITEM'] ?? $b['ITEMID'])
)
);