我想比较两个数组, $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 。 为什么会这样?
I am trying to compare the two arrays, $a and $b and need their intersection.
$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);In the two arrays, there is one common thing that is, ['min' => 23 , 'max' => 987 , 'vmin' => 78] and I will expect the result to reflect this thing. But instead the result is:
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 ) ) 3It just returns the whole array $a. Why is it so?
最满意答案
compare函数不应返回true(等于时)和false(不同时),但是PHP文档中声明的带符号数:
如果第一个参数被认为分别小于,等于或大于第二个参数,则比较函数必须返回小于,等于或大于零的整数。
由于比较函数仅针对某些对调用,仅足以确定顺序,因此返回正确的值非常重要,而不是仅在两个值不同时返回1。 这是必要的,否则PHP可能得出错误的结论并说:因为a <b和b <c , a永远不能等于c ,所以我不会为a和c调用compare函数。
这是一个产生正确结果的比较函数:
$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 ) )The compare function is not supposed to return true (when equal) and false (when different), but a signed number as stated in the PHP documentation:
The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.
As the compare function is only called for some pairs, just enough to determine the order, it is important to return a correct value, not just 1 when the two values are different. This is necessary as otherwise PHP may draw wrong conclusions and say: since a < b and b < c, a can never be equal to c, so I will not call the compare function for a and c.
Here is a compare function that produces the correct results:
$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; });See it run on eval.in with some other data.
Output for the data in the question is:
Array ( [0] => Array ( [min] => 23 [max] => 987 [vmin] => 78 ) )更多推荐
发布评论