使用场景
对数组根据键值,进行多级排序,类似mysql order by。
本文章参考大佬文章,原文点这里。
使用示例
例:我们想按成绩倒序排列,如果成绩相同就按名字的升序排列等。
$guys = Array
(
[0] => Array
(
[name] => jake
[score] => 80
[grade] => A
)
[1] => Array
(
[name] => jin
[score] => 70
[grade] => A
)
[2] => Array
(
[name] => john
[score] => 80
[grade] => A
)
[3] => Array
(
[name] => ben
[score] => 20
[grade] => B
)
)
$scores = array(80,70,80,20);
$names = array('jake','jin','john','ben');
然后
array_multisort($scores, SORT_DESC, $names, $guys);就行了
封装方法
// 调用示例
$arr = [
0 => array:4 [
"id" => 10062
"年级" => "一年级"
"成绩" => "90"
"班级" => "一班"
]
1 => array:4 [
"id" => 10001
"年级" => "一年级"
"成绩" => "90"
"班级" => "二班"
]
]
$resSort = $this->sortByMultiCols($arr, [
'年级' => SORT_ASC,
'成绩' => SORT_DESC,
'班级' => SORT_DESC,
]);
/**
* @note 数组重新排序
* @param array $arr 要排序的数组
* @param array $args 排序的键
* @return array 排序后的数组
*/
protected function sortByMultiCols(array $arr, array $args): array
{
$sortArray = array();
$sortRule = '';
foreach ($args as $sortField => $sortDir) {
foreach ($arr as $offset => $row) {
$sortArray[$sortField][$offset] = $row[$sortField];
}
$sortRule .= '$sortArray[\'' . $sortField . '\'], ' . $sortDir . ', ';
}
if (empty($sortArray) || empty($sortRule)) {
return $arr;
}
eval('array_multisort(' . $sortRule . '$arr);');
return $arr;
}