You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对动态数量数组按组合递减执行array_intersect()?

实现动态数组的递进式交集查找

核心思路

从所有数组的交集开始检查,若结果为空,则依次尝试数量递减的数组组合(比如4个数组先查3个的所有组合,再查2个的所有组合),直到找到非空的交集结果。整体步骤为:

  1. 优先检查全量数组的交集
  2. 生成指定数量的数组组合
  3. 对每个组合计算交集,筛选非空结果

代码实现

首先需要一个生成数组组合的工具函数(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:43:00