0

私はこのトピックをカバーするいくつかの質問(例えばここ)を知っていますが、それらのどれも(少なくとも私が見つけたものから)私が必要とすることをしません。

3つの要素の配列があるとします[1, 2, 3]。繰り返し要素の組み合わせを含め、すべての可能な一意の組み合わせを見つける必要があります(したがって、ここのような順列を除く)。したがって、結果は次のようになります。

[1]
[2]
[3]
[1, 1]
[1, 2]
[1, 3]
[2, 2]
[2, 3]
[3, 3]
[1, 1, 1]
[1, 1, 2]
[1, 1, 3]
[1, 2, 2]
[1, 2, 3]
[1, 3, 3]
[2, 2, 2]
[2, 2, 3]
[2, 3, 3]
[3, 3, 3]

[3, 2, 1]またはのようなサブセットを除い[2, 1, 3]て、それは。と同じもの[1, 2, 3]です。

どうすればこれを達成できますか?

4

1 に答える 1

5

再帰を使用した高速ソリューション。おそらくそれを行うための最良の方法ではありませんが、それで作業は完了します。

<?php

$arr = array(1,2,3);
$result = array();

function combinations($arr, $level, &$result, $curr=array()) {
    for($i = 0; $i < count($arr); $i++) {
        $new = array_merge($curr, array($arr[$i]));
        if($level == 1) {
            sort($new);
            if (!in_array($new, $result)) {
                $result[] = $new;          
            }
        } else {
            combinations($arr, $level - 1, $result, $new);
        }
    }
}
for ($i = 0; $i<count($arr); $i++) {
    combinations($arr, $i+1, $result);
}

// TEST
foreach ($result as $arr) {
    echo join(" ", $arr) . '<br>';
}

?>
于 2013-03-25T21:41:27.243 に答える