我们要做的,是在2组拆分球员:竞争者1个&竞争者2.我们要填补连续球员争夺一个同校的:
如果我们命名学校简洁一个字母,我们就基本上拥有的是:
A A A A B B B C
C C D D E E F F
或者,如果我们甩掉它,它变得更清晰:
A C
A C
A D
A D
B E
B E
B F
C F
如果一个学校有>的玩家总人数的一半,会发生什么?好吧,让我们来看看:
A A A A A
A B B C D
所以:
A A <= one A vs. A, which is unavoidable, but the method still works.
A B
A B
A C
A D
我在这里被骗了一下:我整理出从最大的学校选手第一。但是,只要我们将学校分组在一起,它仍然有效。让我们把我的$a = range('A','F'); shuffle($a):
输出,在这里产生了:FCADBE,这给了我们:
F A
F D
C D
C B
C B
A B
A E
A E
..这工作,也为A>半:
C A
A A <= that one double again, unavoidable
A D
A B
A B
让我们打入部分这一点。我们要做的是:
- 玩家通过学校
- 突破此有序阵列分为2组排序。
- 通过从第一组&中添加一个从第二组开始按顺序创建配对。
砍倒它是如此,你可以找到答案的优点:
- hundreds of questions on SO
- this is a nice answer
- 我们可以使用一个MultiIterator,这将是一个合乎逻辑的(和工作)的选择,但我会告诉你另一种创建2个阵列对的简短方法(或者如果您有3个阵列等,则为三元组)
所以,让我们做到这一点:
//sort by school
$players = ... your array ...
usort($players,function($playerA, $playerB){
return strcmp($playerA['school'], $playerB['school']);
});
//voila, sorted
//break this into 2 groups:
$size = ceil(count($players)/2); // round UP
$groupA = array_slice($players,0,$size);
$groupB = array_slice($players,$size);
//create our duels array:
$duels = array_map(null, $groupA, $groupB);
$duels
现在有这项内容与您输入:
[
[
{
"name": "juan",
"school": "ABC"
},
{
"name": "arnold",
"school": "DEF"
}
],
[
{
"name": "leo",
"school": "ABC"
},
{
"name": "ash",
"school": "ECD"
}
],
[
{
"name": "simon",
"school": "DEF"
},
{
"name": "luke",
"school": "ECD"
}
]
]