为所有潜在组合创建动态for循环PHP函数

时间:2012-04-04 02:08:04

标签: php for-loop combinations

下面的代码将为您拥有四个不同变量时可能出现的所有可能组合创建一个数组。变量总是需要等于1.我创建的for循环工作,我理解如何使这个工作更多的变量,但我可以使这动态吗?我需要一个函数,它有多少变量作为参数。如果有三个变量则创建三个forloops。如果有10个...创建10个相应的循环以确定所有可能的组合。

$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 );

1 个答案:

答案 0 :(得分:0)

您实际上希望以各种不同的方式向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来解决N=k-1(某些常量)的问题 - 也就是说,我们使用解决方案来解决问题。这将在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;
}    

这样的事情应该可以胜任。