Как отсортировать массив в php?

Доброго дня!
Подскажите пожалуйста как отсортировать массив пользовательской сортировкой, например есть массив:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Нужно получить
1 7 13 2 8 14 3 9 15 4 10 16 5 11 17 6 12 18

Это нужно для перестроения матрицы вот пример:
Элементы выводятся по три в столбец
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18
  • Вопрос задан
  • 141 просмотр
Решения вопроса 1
v3shin
@v3shin
Веб-шаман
function transpose($array) {
    array_unshift($array, null);
    return call_user_func_array('array_map', $array);
}
$array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];
var_dump(call_user_func_array('array_merge', transpose(array_chunk($array , 6))));
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В общем случае - составить две формулы, получение номера столбца и номера в столбце и использовать их в usort.
В данном случае вторая формула не нужна, поскольку внутри столбца порядок сортировки стандартный.
$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];
usort(
    $arr,
    function (int $a, int $b): int {
        $result = (($a - 1) % 6) - (($b - 1) % 6);
        return $result === 0 ? $a - $b : $result;
    }
);
print_r($arr);
/* Array
(
    [0] => 1
    [1] => 7
    [2] => 13
    [3] => 2
    [4] => 8
    [5] => 14
    [6] => 3
    [7] => 9
    [8] => 15
    [9] => 4
    [10] => 10
    [11] => 16
    [12] => 5
    [13] => 11
    [14] => 17
    [15] => 6
    [16] => 12
    [17] => 18
) */
Ответ написан
@rPman
Отсортировать как обычно и транспонировать матрицу, (x,y) элементы которой это элемент в твоем массиве = x+y*количество_столбцов, транспонированная матрица будет соответственно y+x*количество_строк.

т.е. тебе достаточно скопировать матрицу в новый массив используя для первого индекс как в первой формуле а для второй - как во второй соответственно.

p.s. это не эффективный но самый понятный алгоритм.
эффективный это просто перестановка элементов, пробегаясь по диагоналям итоговой таблицы
Ответ написан
Комментировать
@TsSaltan
Подели сначала на 3 отдельных массива
1 2 3 4 5 6

7 8 9 10 11 12

13 14 15 16 17 18

Потом из каждого массива бери сначала первый элемент, затем второй и т.д.
Ответ написан
Комментировать
402d
@402d
начинал с бейсика на УКНЦ в 1988
$cols_count = 7;
$rows_count = 3;
for($row=0;$row<$rows_count;$row++){
  for($cols=0;$cols<$cols_count;$cols++){
      $i = $cols + $row*$cols_count;
     echo $array[$i];
  }
}


Зачем его сортировать ? Просто выводить так как нужно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы