使用 usort 按多个数组列排序

Sorting by several array columns with usort

我知道我可以使用这样的方法按一列对数组进行排序:

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 可以完成的工作?谢谢

我相信你的意思是array-multisort

array_multisort — Sort multiple or multi-dimensional arrays

简单示例:

$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 中的版本字段排序。

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

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

一样

虽然它看起来比多重排序代码多一些,但它更灵活。取决于你是否想计算里面的东西。例如:按列的长度排序。

您可以使用 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