Php 每次使用相同的选项获得x数量斑点的所有唯一组合

Php 每次使用相同的选项获得x数量斑点的所有唯一组合,php,algorithm,loops,unique,combinations,Php,Algorithm,Loops,Unique,Combinations,我不确定正确的术语,但我需要一个程序,为固定数量的选项和可变数量的点提供所有独特的组合,例如: options: "a", "b", "c" max spots: 3 output: a a a a b a c a a a a a b a b b a a c a c c a b c b b b b c b b b b b c b c c c c c c c c 我目前有这段代码,但我不知道如何使它在更多的地方具有可变的可伸缩性。通常情况下,它将组合放入数组中,而不是打

我不确定正确的术语,但我需要一个程序,为固定数量的选项和可变数量的点提供所有独特的组合,例如:

options: "a", "b", "c"  
max spots: 3

output:
a 
a a 
a b
a c
a a a 
a a b
a b b 
a a c
a c c 
a b c
b
b b 
b c
b b b
b b c 
b c c 
c
c c 
c c c 
我目前有这段代码,但我不知道如何使它在更多的地方具有可变的可伸缩性。通常情况下,它将组合放入数组中,而不是打印它,该数组随后用于其他计算

$options = array("a", "b", "c");

for ($x = 0; $x < 3; $x++) {
    print "$options[$x]\n";
    for ($y = $x; $y < 3; $y++) {
        print "$options[$x] $options[$y]\n";
        for ($z = $y; $z < 3; $z++) {
            print "$options[$x] $options[$y] $options[$z]\n";
        }
    }
}
$options=数组(“a”、“b”、“c”);
对于($x=0;$x<3;$x++){
打印“$options[$x]\n”;
对于($y=$x;$y<3;$y++){
打印“$options[$x]$options[$y]\n”;
对于($z=$y;$z<3;$z++){
打印“$options[$x]$options[$y]$options[$z]\n”;
}
}
}

我的另一个成功尝试是将生成的组合放入数组,对该数组进行排序,将该数组转换为字符串,并检查该字符串是否已存在于包含所有已接受组合字符串的数组中。这似乎效率极低,我希望有更好的方法。我强烈建议不要使用外部函数,因为我希望在PHP和循环等方面做得更好

您可以使用递归(这假设您在选项数组中只有唯一的字符,如果没有,则必须先执行该操作):

函数打印组合(&$options,$max,$index=0,$prefix=''){
如果($前缀)
打印“$prefix\n”;

如果($max),这里有一个不需要引用的生成器实现

function permutations($alphabet, $max, $prefix = '') {
    $alphabetRemaining = $alphabet;

    if ($prefix) {
        yield $prefix;
    }

    if ($max <= 0) {
        return;
    }

    foreach ($alphabet as $alpha) {
        yield from permutations($alphabetRemaining, $max - 1, $prefix . $alpha);
        array_shift($alphabetRemaining);
    }
}

foreach (permutations(["a", "b", "c"], 3) as $perm) {
    echo "$perm\n";
}
函数置换($alphabet,$max,$prefix=''){ $alphabetRemaining=$alphabet; 如果($前缀){ 产生$prefix; }
if($max)如果你使用递归并不难。谢谢,我是编程新手,所以没听说过。我会看看我能走多远。好吧,既然没有人回答,现在我可以向你展示如何…哇,谢谢allot,没想到它会这么简单,但它非常有效。那些递归函数肯定会成为我其他项目中的一个方便工具。:-)生成器函数对我来说也是一个新概念,所以我会尽可能地研究它的用法和优点。没有引用,但效率也不高。引用比复制整个数组然后移动它要好。对吗?不,不一定。@maraca PHP引用不是指针,PHP变量也不是简单的内存块。PHP引用是令人困惑的,经常会导致代码行为不正常,通常没有人们认为的性能优势。需要注意的是,许多使用引用的PHP内置函数确实具有所有这些优势,因为它是在C语言中编译的,在后台充满了优化和实际指针。@Sammitch如果不修改没有理由每次调用都复制所有内容。PHP是写时复制,仅供参考。
function permutations($alphabet, $max, $prefix = '') {
    $alphabetRemaining = $alphabet;

    if ($prefix) {
        yield $prefix;
    }

    if ($max <= 0) {
        return;
    }

    foreach ($alphabet as $alpha) {
        yield from permutations($alphabetRemaining, $max - 1, $prefix . $alpha);
        array_shift($alphabetRemaining);
    }
}

foreach (permutations(["a", "b", "c"], 3) as $perm) {
    echo "$perm\n";
}
a aa aaa aab aac ab abb abc ac acc b bb bbb bbc bc bcc c cc ccc
function permutations($alphabet, $max, $prefix = '') {
    $alphabetRemaining = $alphabet;

    if ($prefix) {
        yield $prefix;
    }

    if ($max <= 0) {
        return;
    }

    foreach ($alphabet as $alpha) {
        yield from permutations($alphabetRemaining, $max - 1, $prefix . $alpha);
    }
}

foreach (permutations(["a", "b", "c"], 3) as $perm) {
    echo "$perm\n";
}
a aa aaa aab aac ab aba abb abc ac aca acb acc b ba baa bab bac bb bba bbb bbc bc bca bcb bcc c ca caa cab cac cb cba cbb cbc cc cca ccb ccc