php利用array_multisort实现多维数组指定多个字段进行自定义排序如下:
//多维数组指定多个字段排序
function sortArrByManyField(){
$args = func_get_args();
if(empty($args)){
return null;
}
$arr = array_shift($args);
if(!is_array($arr)){
throw new Exception("不是数组");
}
foreach($args as $key => $field){
if(is_string($field)){
$temp = array();
foreach($arr as $index=> $val){
$temp[$index] = $val[$field];
}
$args[$key] = $temp;
}
}
$args[] = &$arr;//引用值
call_user_func_array('array_multisort',$args);
return array_pop($args);
}
//测试数组
$data[] = array('score' => 67, 'class' => 2);
$data[] = array('score' => 86, 'class' => 1);
$data[] = array('score' => 85, 'class' => 6);
$data[] = array('score' => 98, 'class' => 2);
$data[] = array('score' => 86, 'class' => 6);
$data[] = array('score' => 67, 'class' => 7);
// Pass the array, followed by the column names and sort flags
$sorted = sortArrByManyField($data, 'score', SORT_DESC, 'class', SORT_ASC);
?>
默认按数值排序,直接使用array_multisort函数的相关参数修改即可,附参数值:
SORT_REGULAR - 默认。把每一项按常规顺序排列(Standard ASCII,不改变类型)。
SORT_NUMERIC - 把每一项作为数字来处理。
SORT_STRING - 把每一项作为字符串来处理。
SORT_LOCALE_STRING - 把每一项作为字符串来处理,基于当前区域设置(可通过 setlocale() 进行更改)。
SORT_NATURAL - 把每一项作为字符串来处理,使用类似 natsort() 的自然排序。
SORT_FLAG_CASE - 可以结合(按位或)SORT_STRING 或 SORT_NATURAL 对字符串进行排序,不区分大小写。
如:
$myList= sortArrByManyField($list,'count',SORT_DESC,'level',SORT_ASC,'name',SORT_ASC,SORT_STRING);
如需中文排序用SORT_STRING 不准,可将数组中元素增加转化一项拼音,有现成的函数或第三方类库,我用的是https://github.com/overtrue/pinyin 直接composer