Сортировка по нескольким столбцам массива с помощью usort - PullRequest
3 голосов
/ 21 мая 2019

Мне известно о том, что я могу сортировать массив по одному столбцу, используя что-то вроде этого:

function cmp($a, $b)
{
    return $b['column'] - $a['column'];
}

usort($array, "cmp");

Это имитирует ORDER BY column DESC.

Что если я хочусмоделировать ORDER BY column1 DESC, column2 ASC или ORDER BY column1, column2 DESC или также больше столбцов?Возможно ли это с помощью PHP или это работа, которую может выполнять только SQL?Спасибо.

Ответы [ 3 ]

3 голосов
/ 21 мая 2019

Я полагаю, вы имеете в виду массив-мультисорт

array_multisort - сортировка нескольких или многомерных массивов

Простой пример:

$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);

array_multisort(array_column($data, 'volume'), SORT_DESC, array_column($data, 'edition'), SORT_ASC, $data);

Это приведет к сортировке $data сначала по полю тома в DESC, а затем по полю редактирования в ASC.

1 голос
/ 21 мая 2019

Это легко.Сортировка по нескольким столбцам означает, что вы просто используете другой критерий сортировки, если первый критерий сортировки равен:

function cmp($a, $b)
{
  if ($a['col1'] !== $b['col1']) {
    return $b['col1'] - $a['col1'];
  }
  return $a['col2'] - $b['col2'];
}

usort($array, 'cmp');

это то же самое, что и ORDER BY col1 DESC, col2 ASC

Хотя кажется, что немного больше кодачем мультисорт, он гораздо более гибкий.Зависит, если вы хотите вычислить что-то внутри.Например: сортировка по длине столбца.

0 голосов
/ 21 мая 2019

Вы можете использовать цикл foreach, сортировку данных $.

<?php
   $data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);

// Obtain a list of columns
foreach ($data as $key => $row) {
    $volume[$key]  = $row['volume'];
    $edition[$key] = $row['edition'];
}

// Sort the data with volume descending, edition ascending
// Add $data as the last parameter, to sort by the common key
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
var_dump($data);

Рабочая ДЕМО

...