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



我正试图比较两个数组,$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。为什么会这样呢?

比较函数不应该返回true(当相等时)和false(当不同时),而是PHP文档中声明的带符号数字:

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

由于只对某些对调用compare函数,仅足以确定顺序,因此重要的是返回正确的值,而不是在两个值不同时仅返回1。这是必要的,否则PHP可能得出错误的结论,并说:since a and B a永远不可能等于c,所以我不会为ac调用比较函数。

下面是一个产生正确结果的比较函数:
$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上运行。

问题中数据的输出为:

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

From array_uintersect文档:

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

如果相等,返回布尔值true,在int中是1。一个肮脏的hack是返回false,这将是int中的0,在比较函数中表示相等。

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

相关内容

  • 没有找到相关文章

最新更新