自动构建我需要的尽可能多的嵌套循环?

时间:2018-11-09 19:46:18

标签: php loops nested

我想列出所有可能的插入数字组合。我想出了这种方式:

     for($x=1;$x<=3;$x++){
         for($y=1;$y<=3;$y++){
             for($e=1;$e<=3;$e++){

             echo $x.$y.$e."</br>" ;

            }
          }   
        }

但是这些嵌套循环的问题在于,我必须手动放置与数字中数字一样多的循环。有没有办法使它自动/编程?

1 个答案:

答案 0 :(得分:0)

您可以在必要时使用递归函数再次循环。

例如,此函数打印出给定数字位数的数字1-3(最小允许值为1,如果更低,它仍将输出该范围内的所有一位数字):

function variations($digits, $prefix = '') {
    for ($i = 1; $i <= 3; $i++) {
        $variation = $prefix . $i;

        if ($digits > 1) {
            variations($digits - 1, $variation);
        } else {
            echo $variation . "<br />";
        }
    }
}

variations(1);
/*
1<br />2<br />3<br />
*/

variations(2);
/*
11<br />12<br />13<br />21<br />22<br />23<br />31<br />32<br />33<br />
*/

https://3v4l.org/Rj2u7(出于显示目的,输出换行而不是"<br />"

有一个细微的变化,它可以将生成的数字返回到数组中,而不是直接echo对它们进行运算,因此,如果您愿意,可以将其用于其他目的

function variations($digits, $prefix = '') {
    $result = [];

    for ($i = 1; $i <= 3; $i++) {
        $variation = $prefix . $i;

        if ($digits > 1) {
            $result = array_merge($result, variations($digits - 1, $variation));
        } else {
            $result[] = $variation;
        }
    }

    return $result;
}

print_r(variations(1));
/*
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
*/

print_r(variations(2));
/*
Array
(
    [0] => 11
    [1] => 12
    [2] => 13
    [3] => 21
    [4] => 22
    [5] => 23
    [6] => 31
    [7] => 32
    [8] => 33
)
*/

https://3v4l.org/LBrjA