如何对动态数量数组按组合递减执行array_intersect()?
实现动态数组的递进式交集查找
核心思路
从所有数组的交集开始检查,若结果为空,则依次尝试数量递减的数组组合(比如4个数组先查3个的所有组合,再查2个的所有组合),直到找到非空的交集结果。整体步骤为:
- 优先检查全量数组的交集
- 生成指定数量的数组组合
- 对每个组合计算交集,筛选非空结果
代码实现
首先需要一个生成数组组合的工具函数(PHP无内置组合生成方法):
/** * 生成数组的k元素组合 * @param array $arr 原数组 * @param int $k 选取元素的数量 * @return array 所有组合的集合 */ function getCombinations(array $arr, int $k): array { $n = count($arr); if ($k > $n || $k <= 0) return []; if ($k == $n) return [$arr]; if ($k == 1) return array_map(fn($item) => [$item], $arr); $combinations = []; // 递归生成组合 for ($i = 0; $i <= $n - $k; $i++) { $first = $arr[$i]; $remaining = array_slice($arr, $i + 1); foreach (getCombinations($remaining, $k - 1) as $subComb) { array_unshift($subComb, $first); $combinations[] = $subComb; } } return $combinations; }
接着是主逻辑代码,适配你的动态数组场景:
// 示例数组 $a1 = ['a', 'b']; $a2 = ['a', 'c']; $a3 = ['d', 'e']; $a4 = ['d', 'f']; // 统一存入数组(支持动态数量) $arrays = [$a1, $a2, $a3, $a4]; $arrayCount = count($arrays); $foundResults = []; // 第一步:检查全量数组的交集 $fullIntersect = call_user_func_array('array_intersect', $arrays); if (!empty($fullIntersect)) { $foundResults['full'] = $fullIntersect; } else { // 从k = arrayCount-1 递减到2,逐个尝试 for ($k = $arrayCount - 1; $k >= 2; $k--) { // 生成所有k个数组的组合 $combinations = getCombinations($arrays, $k); foreach ($combinations as $comb) { // 计算当前组合的交集 $intersect = call_user_func_array('array_intersect', $comb); if (!empty($intersect)) { // 记录组合对应的交集结果(可按需调整存储格式) $foundResults["k=$k"][] = [ 'combination_indices' => array_keys(array_flip($arrays) + array_flip($comb)), 'intersect' => $intersect ]; } } // 若当前k下找到结果,可选择停止循环(按需调整) if (!empty($foundResults["k=$k"])) { break; } } } // 输出结果 print_r($foundResults);
关键说明
call_user_func_array('array_intersect', $comb):将组合数组拆分为array_intersect的多参数输入,适配动态数组数量- 组合生成函数采用递归实现,支持任意数量的原数组
- 可根据需求调整逻辑:比如找到第一个非空交集就返回,或收集所有可能的非空交集
示例运行结果
针对你的示例数组,最终会找到2数组组合的交集:
Array ( [k=2] => Array ( [0] => Array ( [combination_indices] => Array ( [0] => 0 [1] => 1 ) [intersect] => Array ( [0] => a ) ) [1] => Array ( [combination_indices] => Array ( [0] => 2 [1] => 3 ) [intersect] => Array ( [0] => d ) ) ) )
内容的提问来源于stack exchange,提问作者Angiras
相关产品推荐
相关产品推荐

