我有以下简单的函数来尝试理解
array_udiff()
函数
function udiffCompare( $value, $value2 )
{
echo $value . " - " . $value2 . "<br />";
}
$newArray = array(
'value2' => 2,
'value3' => 3,
'value4' => 4
);
$newArray2 = array(
'value2' => 2,
'value3' => 3,
'value4' => 4
);
array_udiff( $newArray, $newArray2, 'udiffCompare' );
我希望这会简单地返回:
2 - 2
3 - 3
4 - 4
但是它返回:
3 - 2
4 - 3
3 - 2
4 - 3
4 - 4
4 - 3
4 - 3
3 - 2
这让我相信我真的不明白
array_udiff()
是如何工作的。
即使我将上面的 echo 语句替换为:
if( $value == $value2 ) { return 1; } else { return 0; }
即使传递给函数的所有值都相等,输出的数组也完全为空。
请问有人可以发光吗?
array_udiff
计算两个数组的 difference。这是 $newArray
中但不在 $newArray2
中的所有条目。在这种情况下,结果是一个空数组,因为没有区别。
您看到的输出是因为您正在回显正在比较的每个值。这是一个较大列表的原因是,为了找出差异
array_udiff
必须将 $newArray
中的每个值与 $newArray2
中的每个值进行比较。
您没有为 array_udiff() 编写正确的回调函数。
如果第一个参数被认为分别小于、等于或大于第二个参数,则比较函数必须返回小于、等于或大于零的整数。
此外,您给出的这两个样本数组的数学差异是NULL这就是为什么如果您使用此函数,您将得到空结果集。检查一下
array_diff();
灰色区域显示两个集合的差异:
在底层,PHP 的
array_u*()
函数执行排序以提高过滤性能。 值将被比较,一次两个,直到所有值都被排序,然后 PHP 可以有效地确定哪些元素应该保留/删除。
在您的脚本中,您正在回显函数参数,但没有返回任何有意义的结果(并且
array_u*()
函数都期望 3 路比较的结果)。 这意味着all比较的对返回0
——没有平局发生,因此没有性能提升。 因为 0
评估意味着使用 array_udiff()
“删除元素”,所以所有元素都会被删除。
相反,如果您为每对值实现并返回 3 路评估,您将看到不同的回显对,因为需要平局。
另请注意,第一个和第二个参数并不是专门从输入数组中相应位置提取的。 换句话说,
$a
和 $b
值可以来自任何输入数组。 这很重要,因为 array_diff()
和 array_intersect()
函数可以接收两个或更多输入数组。
这里有一个使用不同输入值的演示,以提供更好的清晰度。 演示
$array1 = [1, 2, 3];
$array2 = [4, 5, 6];
function udiffCompare($a, $b)
{
echo "Compare $a and $b\n";
}
var_export(
array_udiff($array1, $array2, 'udiffCompare')
);
echo "\n---\n";
function udiffCompare2($a, $b)
{
echo "Compare $a and $b\n";
return $a <=> $b;
}
var_export(
array_udiff($array1, $array2, 'udiffCompare2')
);
输出:
Compare 1 and 2
Compare 2 and 3
Compare 4 and 5
Compare 5 and 6
Compare 1 and 4
Compare 1 and 2
Compare 2 and 3
array (
)
---
Compare 1 and 2
Compare 2 and 3
Compare 4 and 5
Compare 5 and 6
Compare 1 and 4
Compare 1 and 2
Compare 2 and 4
Compare 2 and 3
Compare 3 and 4
array (
0 => 1,
1 => 2,
2 => 3,
)