我正试图比较两个数组,$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
$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']) ;
}