如何按特定顺序按值对数组进行排序?

时间:2012-09-25 21:57:32

标签: php arrays

给定一个任意大小的数组(从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个游戏,那么它也需要工作。这个想法是第一场比赛和第八场比赛的胜利者在下一轮比赛中相互比赛。第一个游戏和第二个游戏始终是每个支架的第一个和最后一个。然后它向内工作。

2 个答案:

答案 0 :(得分: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。 2vs3。

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

答案 1 :(得分: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。如果元素数量不均匀,则最后一个元素将从结果数组中删除。