【问题标题】:how to loop through array to create specific 6 digit combinations如何遍历数组以创建特定的 6 位组合
【发布时间】:2016-12-26 23:24:26
【问题描述】:

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

表格如下:

第 1 行 - 13 18 31 36 42 48

第 2 行 - 07 09 17 27 28 32

第 3 行 - 01 20 27 37 47 49

第 4 行 - 04 20 33 38 39 45

第 5 行 - 13 22 32 37 39 48

第 6 行 - 01 26 29 30 31 43

第 7 行 - 10 24 27 29 40 46

第 8 行 - 01 08 14 36 37 49

第 9 行 - 01 03 10 18 19 46

第10行- 04 12 24 28 38 42

(*i 在单个数字前添加零只是为了便于阅读) 我试图循环遍历而不复制任何行,但每行只提取一个数字 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++,或者在循环中嵌套另一个“for”循环或“while”循环来实现这一点。但我无法弄清楚。有什么想法、最佳方法、公关最佳实践吗?

【问题讨论】:

    标签: php loops for-loop while-loop


    【解决方案1】:

    请注意,您要查询的是一个包含近 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 行开始),然后再增加。

    【讨论】:

      猜你喜欢
      • 2019-09-12
      • 2016-01-12
      • 2018-01-06
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      相关资源
      最近更新 更多