Php 关于array_udiff,我想再问一次

Php 关于array_udiff,我想再问一次,php,Php,两天前,我问了这个问题()。 很抱歉再次讨论这个问题。 虽然我已经找到了问题的解决方案,但我仍然对这个问题感到困惑: 演示1: 输出: Array ( [c] => Horse ) Array ( [1] => 2 )// it's right 演示2: function myfunction($v1,$v2) { if ($v1===$v2) { return 0; } return 1; } $a1 = array(1,2,3,4,5); $a2 =

两天前,我问了这个问题()。
很抱歉再次讨论这个问题。
虽然我已经找到了问题的解决方案,但我仍然对这个问题感到困惑:
演示1:

输出:

Array ( [c] => Horse )
Array ( [1] => 2 )// it's right
演示2:

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手册,
演示3:


我感到困惑的是,为什么演示1是正常的。

您得到的结果是因为您使用的回调返回
1
0
。虽然从逻辑上讲它是合理的(即
1
表示“相等”,而
0
表示“不相等”)-PHP希望回调返回完全比较-因此,不仅是在相等的情况下,而且是在更大和更小的比较上

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


因此,作为结论:您只能在回调结果中使用full
-1/0/1
值。如果您的回调返回不同的结果,将是不可预测的-这就是为什么它们在不同的输入数据上可能是“正确的”和“错误的”。

您使用的回调函数的输出是什么?太复杂了!
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