我有一个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;在循环内循环以实现此目的。但我无法弄清楚。任何想法,最佳方法,最佳实践?
答案 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行)的行,然后再增加。