mysql — Как отсортировать список массивов в «зигзагообразном» в PHP?

Итак, у меня есть база данных с именами игроков и их уровнем квалификации.
Это выглядит так:

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

Первый игрок в списке с самым высоким уровнем является самым сильным, а последний — самым слабым.

Мне нужно разбить их на группы по 4 игрока, поэтому если у меня будет 24 человека, будет 6 групп.

То, как мне нужно сортировать, я называю зигзагом.

Это выглядит так:

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

Таким образом, группа А будет состоять из игроков: 1, 12, 13, 24.

B группа игроков: 2, 11, 14, 23.

C группа игроков: 3, 10, 15, 22 и так далее.

Это легко сделать вручную, но как я могу автоматизировать этот вид с помощью языка PHP?

Группы должны быть списком массивов (я так думаю), который я мог бы легко поместить в таблицы групп в базе данных.

1

Решение

Идея заключается в следующем:

  • Сортируйте ваши начальные данные (или, желательно, начните с них отсортированы).
  • Разделите его на куски, в основном по одному на каждый из ваших рядов.
  • Обратный порядок каждого другого куска.
  • Переверните матрицу, чтобы получить свои группы — по одной на столбец, а не по одной на строку.

Пример:

// 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
)

)
2

Другие решения

Других решений пока нет …