用usort按几个数组列排序

时间:2019-05-21 04:27:10

标签: php arrays array-column

我知道我可以使用类似以下内容的数组按一列排列数组:

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

usort($array, "cmp");

这模拟了ORDER BY column DESC

如果我想模拟ORDER BY column1 DESC, column2 ASCORDER BY column1, column2 DESC或更多列,该怎么办? PHP是否有可能,或者仅SQL就能完成的工作?谢谢。

3 个答案:

答案 0 :(得分:4)

我相信您是说array-multisort

  

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 :(得分:1)

很简单。按多列排序意味着如果第一个排序标准相等,则仅使用另一个排序标准:

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

虽然看起来比多排序多一些代码,但它却更加灵活。取决于您是否要计算内部的内容。例如:按一列的长度排序。

答案 2 :(得分:0)

您可以使用foreach循环进行$ data排序。

<?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);

工作DEMO