为所有可能的组合创建动态for循环PHP函数


Create dynamic for loop PHP function for all potential combinations

下面的代码将为当您有四个不同的变量时可能发生的所有可能的组合创建一个数组。变量总是需要等于1。我已经创建了for循环,我知道如何使其适用于更多的变量,但我能使其动态吗?我需要一个函数,它有多少变量作为一个参数。如果有三个变量,则创建三个forloop。如果有10个…创建10个对应的for循环,以确定所有可能的组合。

$anarray2 = array();
for( $a = 1; $a <= 97; $a++ ) {
  for( $b = 1; $a + $b <=98 ; $b++ ) {
    for( $c = 1; $a + $b + $c <= 99; $c++ ) {
      $d = 100 - ( $a + $b + $c );
      $var_1 = $a / 100;
      $var_2 = $b / 100;
      $var_3 = $c / 100;
      $var_4 = $d / 100;
      $anarray2[] = array( $var_1, $var_2, $var_3, $var_4 );
    }
  }
}
print_array( $anarray2 );

您实际上希望以各种不同的方式将I相同的项目共享给N人员。

如果有一个人(N==1),那么只有一种方法可以做到这一点——给那个人所有的I项目。

如果有不止一个人(N>1),那么我们可以考虑有多少项目可以分配给第一个人,然后在每种情况下,剩下的N-1个人可能分配什么。

这导致了一个很好的递归解决方案。首先,我们解决了N=1:的问题

function assign($I, $N) {
    $anarray = array();
    if ($N == 1) {
        $anarray[] = array($I);
    } else {
        // Coming up...
    }
return $anarray;
}

现在我们用N=k-1来解决N=k(某个常数)的问题,也就是说,我们用一个较小问题的解来解决这个问题。当N=1时,这将一直回到解决方案。

function assign($I, $N) {
    $anarray = array();
    if ($N == 1) {
        $anarray[] = array($I);
    } else {
        for ($i = $I; $i < $I; $i++) {
            foreach (assign($I - $i, $N - 1) as $subproblem) {
                $anarray[] = array_merge(array($i), $subproblem);
            }
        }
    }
    return $anarray;
}    

这样的东西应该能胜任工作。