我有一个包含两个变量的PHP页面:$nbRank
和$nbNumeric
。根据这两个变量,我想生成一个包含所有现有组合的数组。例如:
如果$nbRank = 3
和$nbNumeric = 2
我会:
0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
0 2 0
0 2 1
0 2 2
1 0 0
1 0 1
1 0 2
1 1 0
1 1 1
1 1 2
1 2 0
1 2 1
1 2 2
2 0 0
2 0 1
2 0 2
2 1 0
2 1 1
2 1 2
2 2 0
2 2 1
2 2 2
因此,我创建了不同的循环和公式来获得最终结果,但它不起作用。这就是我所做的:
$result = array();
$nbIntRank = 0;
$nbIntNumeric = 0;
$nbRank = array();
$nbNumeric = array();
$nb_rangs = 3;
$nb_chiffres = 2;
for ($i = 1; $i <= $nb_rangs; $i++){
$nbRank[$i] = 0;
}
$nbIntRank = count($nbRank);
for ($i = 0; $i <= $nb_chiffres; $i++){
$nbNumeric[$i] = $i;
}
$nbIntNumeric = count($nbNumeric);
$algo = ($nb_rangs * ($nb_chiffres + 1)) * ($nb_rangs * ($nb_chiffres + 1));
$nbLine = $algo / ($nb_rangs);
$occ = 0;
for ($i = 0; $i < $nbLine; $i++){
foreach ($nbRank as $nbrItem => $nbrValue){
$result[$i][] = $nbrValue;
$occ++;
}
}
echo '#############<br />';
echo '### DATAS ###<br />';
echo '#############<br /><br />';
echo '- Nb Elements : '.$algo.'<br />';
echo '- Nb Lines : '.$nbLine.'<br />';
echo '- Nb Valuable Occurency : '.$occ.'<br />';
echo '<br /><hr /><br />';
echo '##############<br />';
echo '### PARSER ###<br />';
echo '##############<br /><br />';
echo '<pre>';
var_dump($result);
echo '</pre>';
我设法用空值创建我的最终数组(81个值,27行3个元素),但它只包含0。
答案 0 :(得分:2)
你表示你对伪代码没问题。抱歉,我不能为你的php代码提供具体的修正[如果出现这些答案 - 他们可能会更有教育意义],但我选择了recursive这个问题的解决方案。
在递归的每个级别中,尝试所有可能性,并调用相同的函数来查找一个较小尺寸的所有组合。
<强>伪码:强>
findCombinations(range,size,sol,resultList):
if (size ==0): #base clause
resultList.append(copy(sol)) #making a copy of sol and appending it as a solution
return
for each i in (0,range):
sol.append(i)
findCombinations(range,size-1,sol,resultList) #recursive invokation, with smaller size
sol.deleteLast() #clean up environment before next calls
使用findCombinations(3,3,[],resultList)
进行调用,其中[]
只是空列表,resultList
将在算法完成后保留组合列表。这个invokation将获得大小为3的所有组合与elemenets 0,1,2。
复杂性说明: 可能性的数量呈指数级增长[O(范围 size )],因此如果您尝试以20,20调用它 - 对于任何解决方案,可能需要一些[很长]的时间。
答案 1 :(得分:2)
$nbRank = 3;
$nbNumeric = 2;
foreach (range(0, base_convert(str_pad('', $nbRank, $nbNumeric), $nbNumeric+1, 10)) as $i) {
echo str_pad(base_convert($i, 10, $nbNumeric+1), 3, 0, STR_PAD_LEFT) . PHP_EOL;
}
简单的想法:你想要的是从0到X的每个数字,基数为$nbNumeric
,因此我们只需将最大数字转换为基数10,使用常见的基于10的运算符对其进行迭代,然后将其转换回来再次基于$nbNumeric
。
可能更具可读性,但实际上完全相同
$nbRank = 3;
$nbNumeric = 2;
// Top is "base_convert(222, 3, 10);" and therefore the upper limit
$top = base_convert(str_pad('', $nbRank, $nbNumeric), $nbNumeric+1, 10);
for ($i = 0; $i <= $top; $i++) {
echo str_pad(base_convert($i, 10, $nbNumeric+1), 3, 0, STR_PAD_LEFT) . PHP_EOL;
}
答案 2 :(得分:0)
这是一个递归解决方案:
$nbRank = 3;
$nbNumeric = 2;
function getCombinations ($length, $min, $max, $aStartingCombinations)
{
if ($length == 1)
{
return range ($min, $max);
}
$final = array ();
foreach (getCombinations ($length - 1, $min, $max, $aStartingCombinations) as $combination)
{
for ($i = $min; $i <= $max; $i++)
{
$final [] = $combination . $i;
}
}
return $final;
}
print_r (getCombinations ($nbRank, 0, $nbNumeric, array ()));