为什么array_udiff返回公共元素


Why is array_udiff returning common elements?

实际应该如何使用array_udiff?与合乎逻辑的预期结果相比,以下测试的结果似乎有点奇怪。

$a1 = array('red');
$a2 = array('red', 'blue');
$diff = array_udiff($a1, $a2,
        function($a, $b) {
            if($a === $b) {
                return 0;
            }
            else {
                return -1;
            }
        });
var_dump($diff);  

上述输出:

array (size=1)
  0 => string 'red' (length=3)  

为什么

为了更好地显示这里的问题,内部array_diff:的输出

$internalDiff = array_diff($a1, $a2);
var_dump($internalDiff);  

输出:

array (size=0)
  empty  

什么???!!!(:))。第二个输出似乎是逻辑的,但为什么array_udiff没有给出相同的输出?

输出是正确的,如果你看一下手册,你就会明白为什么以及它是如何工作的:http://php.net/manual/en/function.array-udiff.php

还有一句话:

如果第一个参数被认为分别小于、等于或大于第二个参数,则比较函数必须返回小于、等于和大于零的整数。

一年后。。。但是对于array_udiff,我认为PHP会认为,如果a>b和b>c,a!=c、 所以它的行为就像a!=c、 即使&c是相等的。使用array_udiff,您必须听取PHP文档,并根据具体情况返回-1和1,而不是在它不是egal时仅返回-1或1,否则它将无法按预期工作。

我发现这篇文章是因为我有同样的问题,和Geo C一样,我不明白为什么我的array_udiff返回公共元素。当两个条目不相等时,我总是返回-1(然后我尝试使用1),现在我检查了更大或更小,效果很好!

仔细想想,PHP尝试以这种方式赢得时间是合乎逻辑的!