这是我获得所有可能性的代码:
$seq[1] = 'd'; $seq[2] = 'f'; $seq[3] = 'w'; $seq[4] = 's'; for($i = 1; $i < 5; $i++) { $s['length_1'][] = $seq[$i]; $c1++; for($i2 = $i+1; $i2 < 5; $i2++) { $s['length_2'][] = $seq[$i].$seq[$i2]; $last = $seq[$i].$seq[$i2]; $c2++; for($i3 = $i2+1; $i3 < 5; $i3++) { $s['length_3'][] = $last.$seq[$i3]; $last = $last.$seq[$i3]; $c3++; for($i4 = $i3+1; $i4 < 5; $i4++) { $s['length_4'][] = $last.$seq[$i4]; $c4++; } } } } for($i = 0; $i < $c1; $i++) echo $s['length_1'][$i].'<br>'; for($i = 0; $i < $c2; $i++) echo $s['length_2'][$i].'<br>'; for($i = 0; $i < $c3; $i++) echo $s['length_3'][$i].'<br>'; for($i = 0; $i < $c4; $i++) echo $s['length_4'][$i].'<br>';
但是,如果要添加更多,则必须再添加一个循环。那么,我该如何使用递归呢?我尝试,我尝试,但是我真的做不到。请帮助并尽可能简单地发布示例。
谢谢。
这是一个简单的算法。从1迭代到2 count(array) -1。在每次迭代中,如果循环计数器的二进制表示形式中的第j位等于1,则在组合中包含第j个元素。
由于PHP需要能够将2个count(array)计算为整数,因此它永远不能超过PHP_INT_MAX。在64位PHP安装上,您的数组不能包含62个以上的元素,因为2 62保留在下面,PHP_INT_MAX而2 63保留在下面。
PHP_INT_MAX
编辑:这将计算所有可能的组合,而不是排列(即’abc’=’cba’)。它通过用二进制表示原始数组并从0到整个数组的二进制表示“计数”来实现,从而有效地构建了每个可能唯一组合的列表。
$a = array('a', 'b', 'c', 'd'); $len = count($a); $list = array(); for($i = 1; $i < (1 << $len); $i++) { $c = ''; for($j = 0; $j < $len; $j++) if($i & (1 << $j)) $c .= $a[$j]; $list[] = $c; } print_r($list);