按多个数组列排序与usort

3

我知道可以通过类似以下方式按照一列对数组进行排序:

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

我相信你指的是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按照卷字段降序排列,然后按版本字段升序排列。

虽然它可以按多列排序,但它不会使用usort进行排序。因此,如果您有一个列不仅需要比较函数,您将不得不使用usort。而问题是“...使用usort” :) - iRaS
你的方法是正确的,而且你的解决方案也可以正常工作。但是我认为这正是原帖作者想要的,即使他不知道... - dWinder

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 相同。
虽然它看起来比多重排序更复杂,但它更加灵活。这取决于你是否想在内部计算某些东西。例如:按列长度排序。

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

正在工作中 演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接