需求:二维数组,先根据字段A排序 如果A一样通过字段B排序。(更多字段排序原理一样)
该功能更好的处理方式请参考:php二维数组按其中某一列排序
使用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);