我知道我可以使用类似以下内容的数组按一列排列数组:
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就能完成的工作?谢谢。
答案 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