我們要做的,是在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"
}
]
]