我需要找出在php中生成数组所有组合列表的最佳算法。
我想要原始数组中所有可能的元素组合。重复的问题只需要排列。不同之处在于我想要包括,例如,“22”,而“22”不在此数组的排列数组中的元素中。
以下是一个例子:
Input : 1, 2, 3
然后输出
Output : 1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 111, 112, 113, 121, 123 ... until 333.
这个问题与Finding the subsets of an array in PHP不同,因为这个问题要求数组的所有组合达到一定长度,而不是阵列的所有排列达到一定长度。特别是,链接的问题将永远不会返回“11”或“332”,而此问题也希望将这些值作为输出。
答案 0 :(得分:2)
这个问题可以通过编写一个递归函数来解决,在这个函数中,你可以根据较短长度组合的数组创建一个组合长达一定长度的数组。有一个长度为1的特殊情况。在这种情况下,组合数组与原始数组相同。对于所有其他长度,我们计算最多比当前长度小1的字符串的组合数组,并添加当前长度的所有组合。
function combi( $arr, $length ) {
if( $length == 1 ) {
return $arr;
} else {
$shorter = combi( $arr, $length - 1 );
$new = Array();
foreach( $shorter as $prefix ) {
if( strlen( $prefix ) == $length - 1 ) {
foreach( $arr as $suffix ) {
$new[] = $prefix . $suffix;
}
}
}
return array_merge( $shorter, $new );
}
}
$a = Array( "1", "2", "3" );
var_dump( combi( $a, count( $a ) ) );
这可能不是最快的方法,因为您将循环遍历不断增长的列表,而大多数元素与生成新字符串无关。除此之外,如果你的输入不是一个字符串数组,你最终得到一个混合的字符串数组,无论你开始使用什么类型的元素。
This ideone显示此代码有效。