无法在两个不同的阵列上执行交集

时间:2016-10-02 08:57:07

标签: php arrays multidimensional-array intersection

我正在尝试比较两个数组$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

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

2 个答案:

答案 0 :(得分:1)

比较函数不应返回true(等于时)和false(不同时),但是PHP documentation中所述的有符号数字:

  

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

由于比较函数仅针对某些对调用,仅足以确定顺序,因此返回正确的值非常重要,而不是仅在两个值不同时返回1。这是必要的,否则PHP可能得出错误的结论并说:因为 a&lt; b b&lt; c a 永远不能等于 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
        )    
)

答案 1 :(得分:0)

来自array_uintersect文档:

  

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

如果相等,则返回布尔值true,其中int为1。一个肮脏的黑客将返回false0中的int,意味着比较函数相同。

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