PHP - 嵌套for循环可变次数

时间:2014-04-07 18:11:59

标签: php for-loop nested-loops

我是PHP的初学者(以及一般的编程)。 为了测试我到目前为止所学到的东西,我编写了这段代码,它打印了一定数量的面具的一组骰子的所有可能组合。 (你最后会找到代码)。

我想要做的是根据$dicenumber变量动态更改嵌套for循环的数量。现在它只能处理3个骰子,因为代码是:

            for ($d1=1; $d1 <= $d1value ; $d1++) { 
                for ($d2=1; $d2 <= $d2value ; $d2++) { 
                for ($d3=1; $d3 <= $d3value ; $d3++) { 
                        array_push(${sum.($d1+$d2+$d3)}, "$d1"."$d2"."$d3");
                    }
                }
            }

但是我想改变它,例如,如果$dicenumber2,它会产生类似的结果:

            for ($d1=1; $d1 <= $d1value ; $d1++) { 
                for ($d2=1; $d2 <= $d2value ; $d2++) { 
                        array_push(${sum.($d1+$d2)}, "$d1"."$d2");
                }
            }

我希望代码可以处理任何数量$dicenumber,无限制。环顾四周,似乎我必须添加某种递归代码,但我不知道如何做到这一点。有小费吗?此外,任何关于我一般错误的反馈都会非常有帮助!谢谢!

            <?php
            //defines the number and type of dice
            $dicenumber = 3;
            $dtype = 6;
            //defines the maximum value of every die 
            for ($i=1; $i <=$dicenumber ; $i++) { 
                ${d.$i.value} = $dtype;
            }
            //defines and array for each possible sum resulting from the roll of the given number of dice. 
            for ($i=$dicenumber; $i <= ($dtype*$dicenumber) ; $i++) { 
            ${sum.$i} = array();
            }

            //the troublesome piece of code I want to change    

            for ($d1=1; $d1 <= $d1value ; $d1++) { 
                for ($d2=1; $d2 <= $d2value ; $d2++) { 
                for ($d3=1; $d3 <= $d3value ; $d3++) { 
                        array_push(${sum.($d1+$d2+$d3)}, "$d1"."$d2"."$d3");
                    }
                }
            }

            //prints all the possible roll combinations, each line lists combination that share the same sum
            for ($i=$dicenumber; $i <= ($dtype*$dicenumber); $i++) { 
        print join(" ", ${sum.$i})."<br />";
        }
        ?>

2 个答案:

答案 0 :(得分:1)

这里我们有一个双功能过程。第一个函数buildArrays以适当的格式创建数组,以提供给第二个函数allCombinations。因此,对于这个使用3 d6的示例,buildArrays将生成一个与此相当的数组:

$data = array(
    array(1, 2, 3, 4, 5, 6),
    array(1, 2, 3, 4, 5, 6),
    array(1, 2, 3, 4, 5, 6));

我会警告你,当你增加骰子的数量和边数时,可能的组合数量会呈指数增长!这意味着您可以在服务器上放置非常大的需求,并且超时和最大内存限制将很快发挥作用。生成的数组可能非常非常大,并且快速消耗超过最大内存限制。那就是说,我们走了:

function buildArrays($dicenumber, $dtype){

    for ($i = 0; $i<$dicenumber; $i++){
        $tmp = array();
        for ($j = 1; $j<=$dtype; $j++){
            $tmp[] = $j;
        }
        $data[$i] = $tmp;
    }
    return $data;
}



function allCombinations($data){

    $result = array(array()); //this is crucial, dark magic.

    foreach ($data as $key => $array) {
        $new_result = array();
        foreach ($result as $old_element){
            foreach ($array as $element){
                if ($key == 0){
                    $new_result[] = $element;
                } else {
                    $new_result[] = $old_element.$element;
                }
            }
        $result = $new_result;
        }
    }
    return $result;
}

//set variables
$dicenumber = 3;
$dtype = 6;

//set_time_limit(0); //You may need to uncomment this for large values.

//call functions
$data = buildArrays($dicenumber, $dtype);
$results = allCombinations($data);

//print out the results
foreach ($results as $result){
    echo $result."<br/>";   
}

N.B。这个答案是the cartesian product code

的变体

答案 1 :(得分:0)

如果您已经学习了函数,则可以进行递归调用并跟踪您所处的数字,然后在每次调用函数时递增它(并在您按下#后结束循环)。 understanding basic recursion