为什么array_udiff返回公共元素?

时间:2015-02-15 23:52:30

标签: php arrays comparison

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没有给出相同的输出?

2 个答案:

答案 0 :(得分:0)

输出是正确的,如果您查看手册,了解原因及其工作原理:http://php.net/manual/en/function.array-udiff.php

从那里引用:

  

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

答案 1 :(得分:0)

一年后......但是对于array_udiff,我认为PHP会认为如果一个> b和b> c,a!= c,所以它就像a!= c一样,即使是& c等于。 使用array_udiff,你真的必须听PHP文档,并根据情况返回-1和1,而不是-1或1,当它不是egal时,否则它不会像你期望的那样工作它起作用。

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

当你考虑它时,PHP尝试以这种方式赢得时间是合乎逻辑的!