-1

给定一个任意大小的数组(从 1 到 4 轮),其等级编号从 1 到 8(或更多),我如何获取该数组并对其进行括号样式排序,所以等级 1 是第一,等级 2 是最后,然后是等级8是下一个,然后排名7是倒数第二个......就像

然后下一轮..

1、4、3、2

我正在尝试对锦标赛括号进行排序,但在排序排名时运气不佳,而且以一种可以很好地扩展的方式,因此显示不会中断。

编辑

一些澄清,每个括号大小需要分解如下:

如果括号有 8 场比赛,则比赛编号为 1 到 8,因此该轮需要自行安排如下:

  • 游戏 1
  • 第 8 场比赛
  • 游戏 5
  • 游戏 4
  • 游戏 6
  • 游戏 3
  • 游戏 7
  • 游戏 2

那么,在下一轮,它有 4 场比赛,结果如下:

  • 游戏 1
  • 游戏 4
  • 游戏 3
  • 游戏 2

等等:

  • 游戏 1
  • 游戏 2

最后,

  • 游戏 1

如果起始组有 16 场比赛而不是 8 场、32 场或更多,它也需要工作。这个想法是第一场比赛和第八场比赛的获胜者在下一轮的第一场比赛中互相比赛。第一局和第二局始终是每个支架上的第一局和最后一场。然后它向内工作。

4

2 回答 2

1

这不是对列表进行排序。除非您真的需要对列表进行排序,否则索引可能会更快、更有效。

比赛将设置为(current_rank), (total ranks) - (current_rank) + 1

由于有8个等级,

1, 8 -1 +1 = 8
2, 8 -2 +1 = 7
3, 8 -3 +1 = 6
4, 8 -4 +1 = 5

所以代码看起来

<?php
    $rankscount = count($ranks);
    for ($i = 1; $i <= $rankscount / 2; $i++) {
        echo "matchup will be: rank " . $i . " , rank " . $rankscount - $i + 1;
    }
?>

在每一轮之后,用新的排序列表重新设置函数,你会得到 1vs4。2对3。

我不是 PHP 的专业人士,但希望这会有所帮助。

于 2012-09-25T22:17:44.360 回答
0

以下函数将 的数组排序['r1', 'r2', 'r3', 'r4', 'r5', 'r6', 'r7', 'r8']为 的顺序['r1', 'r8', 'r2', 'r7', 'r3', 'r6', 'r4', 'r5']。一个数组['r1', 'r2', 'r3', 'r4']将被重新排列成['r1', 'r4', 'r2', 'r3']

function rearranged($array) {
    sort($array);
    $result = array();
    $length = count($array);
    $offset = 0;
    // Handling two elements at once, therefore just do $lenght/2 iterations
    for ($i = 0; $i < $length/2; $i++) {
        // $i + $offset: The current element in the original array 
        // + the offset of fields already filled in the results array
        $result[$i + $offset] = $array[$i];
        // $i + 1 + $offset: The next element in the results array
        $result[$i + 1 + $offset] = $array[$length - $i -1];
            // Increment offset
        $offset++;
    }
    return $result;
}

我没有使用任何内置sort函数,因为它们将所有键相互比较,假设您的数组已经是为了迭代和交换位置应该更快。如果键没有排序,您可以调用内置sort函数,例如sort(按值排序)或ksort(按键排序)。

还要注意的是,此功能仅适用于arrays偶数数量的元素。如果元素的数量不均匀,则将从结果数组中删除最后一个元素。

于 2012-09-25T22:18:30.143 回答