使用 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 ASC
或 ORDER 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
我知道我可以使用这样的方法按一列对数组进行排序:
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 可以完成的工作?谢谢
我相信你的意思是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