关于array_udiff,我想再问一次

时间:2014-01-13 15:21:44

标签: php

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没问题。

1 个答案:

答案 0 :(得分:8)

您获得的结果是因为您正在使用返回10的回调。虽然逻辑上它是合理的(即1表示“相等”而0表示“不相等”) - PHP期望回调完全比较 - 因此,不仅仅是平等 - 但更大和更少比较。

要理解为什么会这样,你需要了解PHP如何处理数组的计算差异。这两个阵列不仅仅是简单的步行。 PHP将首先排序数组,然后进行检查。这是因为简单的walk(嵌套循环)将导致O(n*m)复杂性,而首先排序数组将导致两个大小为O(k log(k)), k=max(n, m)n的数组大约m复杂度。并且要通过用户定义的回调对元素进行排序,还不够来检查元素是否相等。您需要知道他们的订单,这就是为什么需要更少/更多的比较。

因此,作为结论:您只能在其结果中使用具有完整-1/0/1值的回调。如果您的回调返回的内容不同,结果将无法预测 - 这就是为什么他们可能在不同的输入数据上“正确”“错误”