2天前,我问过这个问题(I am confused on the issue,how to use array_udiff)
很抱歉再次讨论这个问题
虽然我已经解决了这个问题,但我仍然对这个问题感到困惑:
demo1的:
function myfunction($v1,$v2)
{
if ($v1===$v2)
{
return 0;
}
return 1;
}
$a1=array("a"=>"Cat","b"=>"Dog","c"=>"Horse");
$a2=array(1=>"Cat",2=>"Dog",3=>"Fish");
print_r(array_udiff($a1,$a2,"myfunction"));
输出:
Array ( [c] => Horse )
DEMO2:
function myfunction($v1,$v2)
{
if ($v1===$v2)
{
return 0;
}
return 1;
}
$a1 = array(1,2,3,4,5);
$a2 = array(1,6,3,4,5);
print_r(array_udiff($a1,$a2,"myfunction"));
我希望这会回来:
Array ( [0] => 2 )
但输出是:
Array ( [0] => 1 [1] => 2 [2] => 3 [4] => 5 )
是的,我知道,我需要根据php手册,
demo3:
function myfunction($v1,$v2) {
if ($v1 < $v2) {
return -1;
} elseif ($v1 > $v2) {
return 1;
} else {
return 0;
}
}
$a1 = array(1,2,3,4,5);
$a2 = array(1,6,3,4,5);
print_r(array_udiff($a1,$a2,"myfunction"));
输出:
Array ( [1] => 2 )// it's right
我很困惑的是为什么demo1没问题。
答案 0 :(得分:8)
您获得的结果是因为您正在使用返回1
和0
的回调。虽然逻辑上它是合理的(即1
表示“相等”而0
表示“不相等”) - PHP期望回调完全比较 - 因此,不仅仅是平等 - 但更大和更少比较。
要理解为什么会这样,你需要了解PHP如何处理数组的计算差异。这两个阵列不仅仅是简单的步行。 PHP将首先排序数组,然后进行检查。这是因为简单的walk(嵌套循环)将导致O(n*m)
复杂性,而首先排序数组将导致两个大小为O(k log(k)), k=max(n, m)
和n
的数组大约m
复杂度。并且要通过用户定义的回调对元素进行排序,还不够来检查元素是否相等。您需要知道他们的订单,这就是为什么需要更少/更多的比较。
因此,作为结论:您只能在其结果中使用具有完整-1/0/1
值的回调。如果您的回调返回的内容不同,结果将无法预测 - 这就是为什么他们可能在不同的输入数据上“正确”和“错误”。