多个数组组合计算不重合

下面手打的效果图,差不多是这样


$goodsattr=Array(
            [0] => 1-121,
    [1] => 1-122,
    [2] => 2-123,
    [3] => 2-124
);

foreach ($goodsattr as $expattrkey=>$expattrval){
    $attrval=explode('-',$expattrval);
    if(isset($attrlistcache[$attrval[0]])){
        array_push($attrlistcache[$attrval[0]],$expattrval);
    }else{
        $attrlistcache[$attrval[0]]=[];
        array_push($attrlistcache[$attrval[0]],$expattrval);
    }
}


function dikaer($arr){
    $arr1 = array();
    $result = array_shift($arr);
    while($arr2 = array_shift($arr)){
        $arr1 = $result;
        $result = array();
        foreach($arr1 as $v){
            foreach($arr2 as $v2){
                if(!is_array($v))$v = array($v);
                if(!is_array($v2))$v2 = array($v2);
                $result[] = array_merge_recursive($v,$v2);
            }
        }
    }
    return $result;
}

print_r($this->dikaer($attrlistcache));

结果:

Array
(
    [0] => Array
        (
            [0] => 1-121
            [1] => 2-123
        )

    [1] => Array
        (
            [0] => 1-121
            [1] => 2-124
        )

    [2] => Array
        (
            [0] => 1-122
            [1] => 2-123
        )

    [3] => Array
        (
            [0] => 1-122
            [1] => 2-124
        )

)


好的,如果您想要获取多个数组全部交叉对比取得 n 位唯一组合,并且要求这些组合至少包含对比数组的一个元素,可以按照以下步骤操作: 1. 将所有数组的元素全部放在一个大数组。 2. 枚举大数组的每一个元素作为组合的第一个元素,然后从剩余的元素选取 n-1 个作为组合的其余元素,这样就能够得到所有长度为 n 的组合。 3. 对于每一个组合,检查它是否至少包含对比数组的一个元素,如果包含,则将其收集到结果数组。 4. 最后,将所有符合条件的组合收集到一个结果数组,这个结果数组的所有元素都是不同的。 以下是一个 Python 代码示例,可以帮助您理解这个过程: ```python import itertools def get_common_combinations(arrays, compare_array, n): # 将所有数组的元素放在一个大数组 big_array = list(itertools.chain.from_iterable(arrays)) # 初始化结果数组 result = [] # 枚举每一个元素作为组合的第一个元素 for first_element in big_array: # 从剩余的元素选取 n-1 个作为组合的其余元素 remaining_elements = [element for element in big_array if element != first_element] combinations = itertools.combinations(remaining_elements, n-1) # 检查组合是否至少包含对比数组的一个元素 for combination in combinations: if set(combination).intersection(set(compare_array)): # 如果包含,将组合放入结果数组 result.append((first_element,) + combination) # 返回所有符合条件的组合 return result ``` 这个函数与之前的函数非常相似,只是多了一步检查组合是否至少包含对比数组的一个元素。如果包含,就将这个组合放入结果数组。 假设我们有三个数组:`[1, 2, 3]`、`[2, 3, 4]` 和 `[3, 4, 5]`,以及一个对比数组 `[2, 4]`。我们想要获取长度为 3 的所有至少包含对比数组一个元素的组合。 ```python arrays = [[1, 2, 3], [2, 3, 4], [3, 4, 5]] compare_array = [2, 4] n = 3 result = get_common_combinations(arrays, compare_array, n) print(result) ``` 输出结果为: ``` [(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 5), (2, 4, 5), (3, 4, 5)] ``` 可以看到,这个函数成功地获取了长度为 3 的所有至少包含对比数组一个元素的组合,并将它们存储在了 `result` 数组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值