我正在尝试比较两个数组$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
。为什么会这样?
答案 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
。一个肮脏的黑客将返回false
,0
中的int
,意味着比较函数相同。
function comp($val1,$val2) {
return !($val1['min'] == $val2['min'] && $val1['max'] == $val2['max'] && $val1['vmin'] == $val2['vmin']) ;
}