如何在PHP中的“zig-zag”中对数组列表进行排序?

时间:2015-03-21 14:50:21

标签: php mysql sorting arraylist

所以我有一个包含球员姓名和技能水平的数据库。 它看起来像这样:

Id | Name  | Level
1  | Peter |  24
2  | Andy  |  23
...
24 | John  |  1

列表中具有最高级别的第一个玩家是最强的玩家,而最后一个玩家是最弱玩家。

我需要与4名玩家分组,所以如果我有24个人,则会有6个小组。

我需要对它进行排序的方式我称之为“zig-zag”。

它是这样的:

Ag Bg Cg Dg Eg Fg
01 02 03 04 05 06
12 11 10 09 08 07
13 14 15 16 17 18
24 23 22 21 20 19

所以A组将由玩家组成: 1,12,13,24

B组球员: 2,11,14,23

C组球员: 3,10,15,22 等。

手动操作很容易,但我如何使用PHP语言自动完成这种操作?

这些组应该是数组列表(我想是这样),我可以轻松地将其放入数据库中的组表。

1 个答案:

答案 0 :(得分:2)

这个想法是:

  • 对起始数据进行排序(或者最好从排序开始)。
  • 将其拆分为块,基本上每行一个。
  • 颠倒每个其他块的顺序。
  • 翻转矩阵,这样您就可以获得组 - 每列一个而不是每行一个。

实施例

// Basic sample data.
$players = range(1, 24);

// Sort them ascending if you need to.
sort($players);

// Make a matrix. 2d array with a column per group.
$matrix = array_chunk($players, ceil(count($players)/4));

// Reverse every other row.
for ($i = 0; $i < count($matrix); $i++) {
    if ($i % 2) {
        $matrix[$i] = array_reverse($matrix[$i]);
    }
}

// Flip the matrix.
$groups = array_map(null, ...$matrix); // PHP 5.6 with the fancy splat operator.
//$groups = call_user_func_array('array_map', array_merge([null], $matrix)); // PHP < 5.6 - less fancy.

// The result is...
print_r($groups);

输出:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 12
            [2] => 13
            [3] => 24
        )

    [1] => Array
        (
            [0] => 2
            [1] => 11
            [2] => 14
            [3] => 23
        )

    [2] => Array
        (
            [0] => 3
            [1] => 10
            [2] => 15
            [3] => 22
        )

    [3] => Array
        (
            [0] => 4
            [1] => 9
            [2] => 16
            [3] => 21
        )

    [4] => Array
        (
            [0] => 5
            [1] => 8
            [2] => 17
            [3] => 20
        )

    [5] => Array
        (
            [0] => 6
            [1] => 7
            [2] => 18
            [3] => 19
        )

)