无法在两个不同的阵列上执行交集(Unable to perform intersection on two different arrays)

编程入门 行业动态 更新时间:2024-10-20 01:21:58
无法在两个不同的阵列上执行交集(Unable to perform intersection on two different arrays)

我想比较两个数组, $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 ) ) 3

It just returns the whole array $a. Why is it so?

最满意答案

compare函数不应返回true(等于时)和false(不同时),但是PHP文档中声明的带符号数:

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

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

更多推荐

本文发布于:2023-08-04 09:21:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1415280.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:阵列   两个   Unable   arrays   intersection

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!