我正在尝试创建允许我获取数组的所有组合以便稍后生成列表的函数。 但我的问题是,目前我的功能将“ab”视为与“ba”不同。我不知道如何用文字解释它,但我想下面的图片举例说明了我试图实现的目标。
function everyCombination($array) {
$arrayCount = count($array);
$maxCombinations = pow($arrayCount, $arrayCount);
$returnArray = array();
$conversionArray = array();
foreach ($array as $key => $value) {
$conversionArray[base_convert($key, 10, $arrayCount)] = $value;
}
for ($i = 0; $i < $maxCombinations; $i++) {
$combination = base_convert($i, 10, $arrayCount);
$combination = str_pad($combination, $arrayCount, "0", STR_PAD_LEFT);
$returnArray[] = strtr($combination, $conversionArray);
}
return $returnArray;
}
$a = everyCombination(array('a', 'b', 'c','d'));
print_r($a);
所需的输出为
a
ab
abc
abcd
b
bc
bcd
c
cd
d
答案 0 :(得分:1)
您需要做的是递归遍历数组,对于每次递归,您应该只迭代所有更大的元素。像这样:
function everyCombination($arr) {
$combos = array();
$len = count($arr);
for( $i=0; $i<$len; $i++) {
for( $j=$i+1; $j<=$len; $j++) {
$combos[] = implode("",array_slice($arr,$i,$j-$i));
}
}
return $combos;
}
示例电话:
everyCombination(['a','b','c','d']);
返回:
['a','ab','abc','abcd','b','bc','bcd','c','cd','d']
答案 1 :(得分:0)
似乎你是在连续的结果之后,所以双循环在这里是更好的选择;递归需要更多的控制。
function combos($array)
{
if (!$array) {
return [];
}
$n = count($array);
$r = [];
for ($i = 0; $i < $n; ++$i) {
$prefix = '';
for ($j = $i; $j < $n; ++$j) {
$r[] = $prefix . $array[$j];
$prefix .= $array[$j];
}
}
return $r;
}
print_r(combos([1, 2, 3, 4]));