N组数组所有可能的组合(类似N个杯子依次取数字所有可能)

php代码

public function group($attr){
    if(count($attr)==1){
        return $attr[array_keys($attr)[0]]; //树最底层的叶节点直接返回
    } 
    $start_tree=$attr[array_keys($attr)[0]]; //递归取出每一层的所有可能与下层拼接
    unset($attr[array_keys($attr)[0]]);
    $tree=$this->group($attr);
    foreach ($start_tree as $k=>$v){
        foreach ($tree as $r=>$l){
            $arr[]= array_merge([$v], is_array($l)?$l:[$l]);
        }
    }
    return $arr;
}

$arr = [[1,2,3], [4,5,6], [7,8], [10,11]];
$this->group($arr)

js代码

function isArray(obj){
    if(typeof obj=="object" && obj.constructor===Array){
        return true;
    }
    return false;
}

    function group(arr){
        if(arr.length === 1){
            return arr.shift(); //树最底层的叶节点直接返回
        }
        let start_tree = arr.shift(); //递归取出每一层的所有可能与下层拼接
        let tree= group(arr);
        let skuArr = []
        start_tree.forEach((item, index) => {
            tree.forEach((item_t, index_t) => {
                item_t = isArray(item_t)?item_t:[item_t]
                skuArr.push([...[item], ...item_t]);
            })
        })
        return skuArr;
    }

let arr = [[1,2,3], [4,5,6], [7,8], [10,11]];
group(arr)

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值