需求:二维数组,先根据字段A排序 如果A一样通过字段B排序。(更多字段排序原理一样)
使用php原生的array_multisort()函数,执行速度会快些且降低自定义函数的依赖,关于array_multisort详细使用 参考:
http://php.net/manual/zh/function.array-multisort.php
思路:
1. 先搜集要排序的字段的值分别组合成一个新的数组
2. 再用 array_multisort 根据要排序的字段值,按先后进行排序就行
示例:
//user_list数组根据多个字段排序,先按照性别将序排列,如果性别相同再按照年龄升序排列
foreach ($user_list as $key => $user) {
$age[$key] = $user['age'];
$gender[$key] = $user['gender'];
}
// 将数据先根据 gender 降序排列,再根据 age 升序排列
// 把 $data 作为最后一个参数,以通用键排序
array_multisort($volume, SORT_DESC, $gender, SORT_ASC, $age);
注意:使用该函数排序完之后,关联(string)键名保持不变,但数字键名会被重新索引。
下面有两个总结的方法,可以参考:
方法一:
function sortByCols($list, $field) {
$sort_arr = array();
$sort_rule = '';
foreach ($field as $sort_field => $sort_way) {
foreach ($list as $key => $val) {
$sort_arr[$sort_field][$key] = $val[$sort_field];
}
$sort_rule .= '$sort_arr["' . $sort_field . '"],' . $sort_way . ',';
}
if (empty($sort_arr) || empty($sort_rule)) {
return $list;
}
eval('array_multisort(' . $sort_rule . ' $list);');
return $list;
}
使用示例:
$user_list = sortByCols($user_list, [
'gender' => SORT_DESC,
'age' => SORT_ASC
]);
方法二:
function sortArrByManyField() {
$args = func_get_args();
if (empty($args)) {
return null;
}
$arr = array_shift($args);
foreach ($args as $key => $value) {
if (is_string($value)) {
$temp = array();
foreach ($arr as $k => $v) {
$temp[$k] = $v[$value];
}
$args[$key] = $temp;
}
}
//引用值
$args[] = &$arr;
call_user_func_array('array_multisort', $args);
return array_pop($args);
}
使用示例:
sortArrByManyField($user_list, 'gender', SORT_DESC, 'age', SORT_ASC);