Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在循环赛中配对?_Php_Arrays_For Loop_Combinations_Combinatorics - Fatal编程技术网

Php 如何在循环赛中配对?

Php 如何在循环赛中配对?,php,arrays,for-loop,combinations,combinatorics,Php,Arrays,For Loop,Combinations,Combinatorics,我正在制作一个锦标赛应用程序,其中有许多(4、6或8)玩家将相互匹配 它是圆形的。因此,如果总共有6名玩家,那么将有5轮,每轮3对。每名球员每轮只能出场一次 我试过的 我一直在使用for循环来获得所需的组合,但是我如何才能将成对的循环分开,这样它们就不会重复?以下是我到目前为止所做的工作(制作每一个组合): 您可以使用此代码。其依据是: 循环中发生的循环移位可以这样可视化,其中数组被“折叠”一半,以显示谁与谁配对(在列中): 玩家1从不移动,位置2的玩家被从阵列中切掉,推到阵列的末端,这意味着

我正在制作一个锦标赛应用程序,其中有许多(4、6或8)玩家将相互匹配

它是圆形的。因此,如果总共有6名玩家,那么将有5轮,每轮3对。每名球员每轮只能出场一次

我试过的 我一直在使用for循环来获得所需的组合,但是我如何才能将成对的循环分开,这样它们就不会重复?以下是我到目前为止所做的工作(制作每一个组合):


您可以使用此代码。其依据是:

循环中发生的循环移位可以这样可视化,其中数组被“折叠”一半,以显示谁与谁配对(在列中):


玩家1从不移动,位置2的玩家被从阵列中切掉,推到阵列的末端,这意味着它将到达位置6。

作为旁注,
$j==$i
是一个不可能的条件,因为
$j<$i
;)如果你真的找不到解决方案,可以洗牌玩家,然后根据你手工找到的解决方案硬编码顺序。这是一个非常糟糕的答案,所以我不会把它作为一个答案发布,这样我就不会被否决:英语不是我的第一语言,所以我不知道这叫做循环算法。非常感谢您的宝贵建议和解决方案。
<?php
$players = [1,2,3,4,5,6];

for($i = 0; $i < count($players); $i++):
    for($j = 0; $j < $i; $j++):
         $pair1 = $players[$j];
         $pair2 = $players[$i];
         $pairs[] = $pair1.$pair2;          
    endfor;
endfor;
/* Output:
   [
     0 => "12"
     1 => "13"
     2 => "23"
     3 => "14"
     4 => "24"
     5 => "34"
     6 => "15"
     7 => "25"
     8 => "35"
     9 => "45"
     10 => "16"
     11 => "26"
     12 => "36"
     13 => "46"
     14 => "56"
   ]*/
$players = [1,2,3,4,5,6];

$n = count($players);
for ($r = 0; $r < $n - 1; $r++) {
    for ($i = 0; $i < $n / 2; $i++) {
        $rounds[$r][] = [$players[$i], $players[$n-1 - $i]];
    }
    // Perform round-robin shift, keeping first player in its spot:
    $players[] = array_splice($players, 1, 1)[0];
}
// shift once more to put array in its original sequence:
$players[] = array_splice($players, 1, 1)[0];
[
  [[1,6],[2,5],[3,4]]
  [[1,2],[3,6],[4,5]]
  [[1,3],[4,2],[5,6]]
  [[1,4],[5,3],[6,2]]
  [[1,5],[6,4],[2,3]]
]