假设,有数组$arr,$arr 有 n ( n>=2 )个 key => value ( value 是数组),本例取 3 个:
$arr = [
'A' => [1, 2, 4, 5],
'B' => [2, 3, 4, 5, 6],
'C' => [1, 2, 3, 4, 5, 6],
];
获取差异数组结果为:
$arr = [
'A' => [1],
'B' => [3, 6],
'C' => [1, 3, 6],
];
即,$arr 数组下 n 个 key 对应数组取交集,再和当前 key 对应数组对比取不同。但是 n 得数量不确定。
请问如何实现?谢谢!
1
0ZXYDDu796nVCFxq 2020-12-02 11:34:36 +08:00 via Android
把子数组构成 set
然后求多个 set 的交集 最后把交集在子数组里删掉 |
2
jmc891205 2020-12-02 11:46:32 +08:00
可以用 divide and conquer 来设计吧
n 个数组的交集,肯定是前 n/2 个数组的交集和后 n/2 个数组的交集的交集 |
3
Ct1L 2020-12-02 19:09:57 +08:00 1
<?php
$arr = [ 'A' => [1, 2, 4, 5], 'B' => [2, 3, 4, 5, 6], 'C' => [1, 2, 3, 4, 5, 6] ]; // 求全部元素的交集 array_walk($arr,function ($v)use(&$temp){ if (empty($temp)) { $temp = $v; }else{ $temp = array_intersect($temp,$v); } }); // 对内部每个元素取差集 $res = array_map(function ($v)use($temp){ return array_diff($v,$temp); },$arr); var_export($res); |