2016-10-02 26 views
0

我想比较两个阵列,$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。为什么这样?

回答

1

比较功能是不应该返回true(相等时)和假(不同的时候),但作为PHP documentation表示有符号数:

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

由于比较函数仅用于某些对,只是足以确定顺序,所以重要的是返回正确的值,而不是仅当两个值不同时为1。这是必要的,否则PHP可能会得出错误的结论,并说:因为一个< bb <Ç一个永远不可能等于ç,所以我不会调用比较函数一个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 
     )  
) 
+0

这将返回一个空数组。 –

+1

@SuhailGupta,你确定吗?我已经添加了链接到eval.in,以便您可以看到它确实会返回预期的输出。 – trincot

+0

不知道,为什么我得到一个空数组 –

0

array_uintersect文档:

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

如果相等,则返回布尔值true,其中int为1。一个肮脏的黑客将返回false,这将是0int,这意味着在比较功能相等。

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