3

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

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

usort($array, "cmp");

这模拟了ORDER BY column DESC.

如果我想通过更多列来模拟ORDER BY column1 DESC, column2 ASCor怎么办?ORDER BY column1, column2 DESC是否可以使用 PHP,或者这几乎是 SQL 可以完成的工作?谢谢。

4

3 回答 3

3

我相信你的意思是数组多排序

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

于 2019-05-21T04:34:00.123 回答
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

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

于 2019-05-21T04:36:58.330 回答
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);

工作演示

于 2019-05-21T10:21:27.610 回答