假设我有3支球队,每支球队需要互相比赛一次。如何有效地迭代它们来安排匹配而不重复?
$teams = range('a', 'c');
$games = array();
foreach ($teams as $t1)
foreach ($teams as $t2)
if ($t1 != $t2)
$games[] = $t1 . ' vs. ' . $t2;
print_r($games);
结果:
Array
(
[0] => a vs. b
[1] => a vs. c
[2] => b vs. a <-- Duplicate of [0]
[3] => b vs. c
[4] => c vs. a <-- Duplicate of [1]
[5] => c vs. b <-- Duplicate of [3]
)
如何有效避免重复匹配?
答案应该产生:
Array
(
[0] => a vs. b
[1] => a vs. c
[2] => b vs. c
)
答案 0 :(得分:3)
一般地:
Container C;
for (i = 0; i < C.size; ++i)
{
for (j = i + 1; j < C.size; ++j)
{
/* have unique unordered set {i, j} */
}
}
如果您想要对角线条目(i, i)
,请从j = i
开始。
答案 1 :(得分:1)
这个解决方案并不像@Kerrek那样优雅,但它的工作方式相同:
$teams = range('a', 'c');
$games = Array();
$matched = Array();
foreach ( $teams as $t1 )
foreach ( $teams as $t2 )
if ( $t1 != $t2 )
if ( !in_array( Array( $t1, $t2 ), $matched ) && !in_array( Array( $t2, $t1 ), $matched ) )
{
$games[] = $t1 . ' vs. ' . $t2;
$matched[] = Array( $t1, $t2 );
}
print_r( $games );