无法对两个不同的数组执行交集

Unable to perform intersection on two different arrays

我正在尝试比较两个数组 $a$b 并需要它们的交集。

$a  = [
    ['min' => 23 , 'max' => 987 , 'vmin' => 78],
    ['min' =>  3 , 'max' =>  87 , 'vmin' =>  8],
    ['min' => 'faryaad' , 'max' => 987 , 'vmin' => 65]
];

$b = [
    ['min' => 23 , 'max' => 987 , 'vmin' => 78],
    ['min' => 'faryaad' , 'max' => 87 , 'vmin' => 8],
    ['min' => 203 , 'max' => 9807 , 'vmin' => 780]
];

$i = array_uintersect($a,$b,"comp");

function comp($val1,$val2) {
    return $val1['min'] == $val2['min'] && $val1['max'] == $val2['max'] && $val1['vmin'] == $val2['vmin'] ;
}
print_r($i);
echo "<br />";
echo count($i);

在这两个数组中,有一个共同点,就是['min' => 23 , 'max' => 987 , 'vmin' => 78],我希望结果能反映这个东西。但结果是:

Array ( [0] => Array ( [min] => 23 [max] => 987 [vmin] => 78 ) [1] => 
Array ( [min] => 3 [max] => 87 [vmin] => 8 ) [2] => Array ( [min] => 
faryaad [max] => 987 [vmin] => 65 ) ) 
3

它只是 returns 整个数组 $a。为什么会这样?

比较函数不应该 return true(相等时)和 false(不同时),而是 PHP documentation:

中所述的有符号数

The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.

由于只对某些对调用比较函数,刚好足以确定顺序,因此 return 一个正确的值很重要,而不仅仅是当两个值不同时为 1。这是必要的,否则 PHP 可能会得出错误的结论并说:因为 a < bb < ca 永远不会等于 c,所以我不会调用 a 的比较函数c.

这是一个产生正确结果的比较函数:

$i = array_uintersect($a,$b,function($val1,$val2) {
    foreach ($val1 as $k => $v) {
        if(!isset($val2[$k])) return -1;
        if ($res = strcmp($v, $val2[$k])) break;
    }
    return $res;
});

eval.in 上查看 运行 和一些其他数据。

问题中数据的输出是:

Array (
    [0] => Array (
            [min] => 23
            [max] => 987
            [vmin] => 78
        )    
)

来自 array_uintersect 文档:

The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.

你 returning 布尔值 true 如果相等,在 int 中是 1。一个肮脏的 hack 是 return false,在 int 中是 0,意思是比较函数相等。

function comp($val1,$val2) {
    return !($val1['min'] == $val2['min'] && $val1['max'] == $val2['max'] && $val1['vmin'] == $val2['vmin']) ;
}