求一个数组,n个元素的不同组合(排列组合问题)

array('a1','b2','c3','d4','e5','x1','y1','z1');比如以上数组

我想要这个数组元素中三个元素的不同组合,例如下

array('a1','b2','c3');
array('a1','b2','d4');
array('a1','b2','e5');
array('a1','b2','x1');
array('a1','b2','y1');

方法一:最先想到的就是n次foreach循环,该方法简单粗暴

$data = array('a1','b2','c3','d4','e5','x1','y1','z1');

foreach ($data as $k_1 => $v_1) {
    foreach ($data as $k_2 => $v_2) {
        foreach ($data as $k_3 => $v_3) {
            if ($v_1 !== $v_2 && $v_1 !== $v_3 && $v_2 !== $v_3) {
                var_dump([$v_1,$v_2,$v_3]);
            }
        }    
    }
}
方法二:运用递归

<?php
$arr = array('a','b','c','d');
$result = array();
$t = getCombinationToString($arr, 3);
print_r($t);

function getCombinationToString($arr, $m) {
    if ($m ==1) {
        return $arr;
    }
    $result = array();

    $tmpArr = $arr;
    unset($tmpArr[0]);
    for($i=0;$i<count($arr);$i++) {
        $s = $arr[$i];
        $ret = getCombinationToString(array_values($tmpArr), ($m-1));

        foreach($ret as $row) {
            $result[] = $s . $row;
        }
    }

    return $result;
}
?>
结果如下:

Array
(
    [0] => abc
    [1] => abd
    [2] => acc
    [3] => acd
    [4] => adc
    [5] => add
    [6] => bbc
    [7] => bbd
    [8] => bcc
    [9] => bcd
    [10] => bdc
    [11] => bdd
    [12] => cbc
    [13] => cbd
    [14] => ccc
    [15] => ccd
    [16] => cdc
    [17] => cdd
    [18] => dbc
    [19] => dbd
    [20] => dcc
    [21] => dcd
    [22] => ddc
    [23] => ddd
)

文章出处:https://segmentfault.com/q/1010000005748820?_ea=890576

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值