如何循环遍历数组以创建特定的6位数组合

时间:2016-12-26 23:24:27

标签: php loops for-loop while-loop

我有一个10行的表,我用一些PHP代码生成。从这个表我想组装每个6位数的组合,而不是从每一行重复。 例如:

表格如下:

第1行 - 13 18 31 36 42 48

Row2 - 07 09 17 27 28 32

Row3 - 01 20 27 37 47 49

Row4 - 04 20 33 38 39 45

Row5 - 13 22 32 37 39 48

Row6 - 01 26 29 30 31 43

Row7 - 10 24 27 29 40 46

Row8 - 01 08 14 36 37 49

Row9 - 01 03 10 18 19 46

Row10- 04 12 24 28 38 42

(*为了便于阅读,我在单个数字前添加了零) 我试图循环而不是重复任何行,但每行只拉一个数字,只有6位数。 有了这组数字,我的输出就是:

13,07,01,04,13,01

13,07,01,04,13,26

13,07,01,04,13,29

13,07,01,04,13,30

13,07,01,04,13,31

13,07,01,04,13,43

13,07,01,04,13,10

13,07,01,04,13,24

13,07,01,04,13,27

13,07,01,04,13,29

13,07,01,04,13,40

13,07,01,04,13,46

13,07,01,04,13,1

13,07,01,04,13,8

... 13,07,01,04,13,14

等等;直到所有第6位数字都已用尽,然后第5位将增加到下一位置,并且所有第6位数值将再次组合。并且继续通过所有位置值。它不应该组装来自同一行的数字组合,即13,18,7,1,4,13将不会被组装,因为13& 18在同一行。 *但是可以有13& 18在同一个组合中,因为18也在第9行。我的观点是,我不是要将13和18排除在一起,因为它们在同一条线上,而是我试图使这些组合基于表中的位置值,循环不会基于相同的行位值创建组合,而不管该位置值中的数字。

另一种看待它的方法是使用我从db编译的数组并从中创建表。 我希望组合如下:

$ array [0] [0],$ array [1] [0],$ array [2] [0],$ array [3] [0],$ array [4] [0],$ array [5] [0]

$ array [0] [0],$ array [1] [0],$ array [2] [0],$ array [3] [0],$ array [4] [0],$ array [5] [1]

$ array [0] [0],$ array [1] [0],$ array [2] [0],$ array [3] [0],$ array [4] [0],$ array [5] [2]

$ array [0] [0],$ array [1] [0],$ array [2] [0],$ array [3] [0],$ array [4] [0],$ array [5] [3]

$ array [0] [0],$ array [1] [0],$ array [2] [0],$ array [3] [0],$ array [4] [0],$ array [5] [4]

$ array [0] [0],$ array [1] [0],$ array [2] [0],$ array [3] [0],$ array [4] [0],$ array [5] [5]

$ array [0] [0],$ array [1] [0],$ array [2] [0],$ array [3] [0],$ array [4] [1],$ array [5] [0]

$ array [0] [0],$ array [1] [0],$ array [2] [0],$ array [3] [0],$ array [4] [1],$ array [5] [1]

$ array [0] [0],$ array [1] [0],$ array [2] [0],$ array [3] [0],$ array [4] [1],$ array [5] [2]

$ array [0] [0],$ array [1] [0],$ array [2] [0],$ array [3] [0],$ array [4] [1],$ array [5] [3]

$ array [0] [0],$ array [1] [0],$ array [2] [0],$ array [3] [0],$ array [4] [1],$ array [5] [4]

$ array [0] [0],$ array [1] [0],$ array [2] [0],$ array [3] [0],$ array [4] [1],$ array [5] [5]

$ array [0] [0],$ array [1] [0],$ array [2] [0],$ array [3] [0],$ array [4] [2],$ array [5] [0]

$ array [0] [0],$ array [1] [0],$ array [2] [0],$ array [3] [0],$ array [4] [2],$ array [5] [1]

$ array [0] [0],$ array [1] [0],$ array [2] [0],$ array [3] [0],$ array [4] [2],$ array [5] [2] ...

希望到目前为止,我已经很好地解释了预期的结果。我试图像这样使用for循环,但是当我到达第6位的值时,我不知道如何迭代下一个级别。

            $tr = 0;
            $td = 0;
            for($i = 0;$i < 6;$i++){
                $combo[] = array($makeArray[$tr][$td],$makeArray[$tr+1][$td],$makeArray[$tr+2][$td],$makeArray[$tr+3][$td],$makeArray[$tr+4][$td],$makeArray[$tr+5][$td]);
                $tr++
            }

我以为我可以以某种方式使用$ tr ++,或者可以使用另一个&#34;用于&#34;循环或&#34;而&#34;在循环内循环以实现此目的。但我无法弄清楚。任何想法,最佳方法,最佳实践?

1 个答案:

答案 0 :(得分:0)

请注意,您所要求的是一个包含近1000万个条目的列表。这是因为您首先想要从10行中取出6行的每个组合,即:

  10! 
------- = 210
6! . 4!

对于其中每一个,您希望从每一行中获取一个元素,并在所选的6行中生成此类选择的任意组合。这是:

6^6 = 46 656

这两个数字的乘积代表了所有可能性:

= 9 797 760

产生它的代码可以使用这两个辅助函数:

function combinations($a, $count, $from = 0) {
    if (!$count) return [[]];
    foreach (range($from, count($a)-$count) as $i) {
        foreach (combinations($a, $count-1, $i+1) as $combi) {
            $result[] = array_merge([$a[$i]], $combi);
        }
    }
    return $result;
}

function ordered_combinations($size, $count) {
    foreach (range(0, pow($size, $count)-1) as $i) {
        $row = [];
        foreach (range(0, $count-1) as $j) {
            array_unshift($row, $i % $size);
            $i = floor($i / $size); 
        }
        $result[] = $row;
    }
    return $result;
}

然后,给定$array,您可以使用以下函数:

$size = 6; // number of rows to combine
$choices = ordered_combinations(count($array[0]), $size);
foreach(combinations($array, $size) as $combi) {
    foreach($choices as $choice) {
        $row = [];
        foreach($choice as $i => $choice) {
            $row[] = $combi[$i][$choice];
        }
        $result[] = $row;
    }
}

现在$result变量将拥有数百万行,每行有6个数字。

首先使用$size=2进行尝试是明智的,这意味着您只想生成包含2个元素(来自2行)的行,然后再增加。