根据多个字段进行排序是产品常会提出的一个需求,而进行排序的通常都是二维数组。php为满足此需求也提供了array_multisort方法,但该方法却有着一定的尿性:如果排序字段一多,很可能不起效果,排序错乱。
以下方法源于PHP 数组按多个字段排序实现代码
,对其进行改装,可自定义排序方式,如中文排序。
该封装函数使用方式与array_multisort的参数一致,只是代表各排序的数组换成了待排序数组里面的字段名称(如果使用自定义函数的话,则是"name"代表字段名称)。
function sortArrByManyField()
{
$args = func_get_args(); // 获取函数的参数的数组
if (empty($args)) {
return null;
}
$arr = array_shift($args);
if (!is_array($arr)) {
throw new Exception("第一个参数不为数组");
}
// print_r($args);die;
foreach ($args as $key => $field) {
if (is_string($field)) {
//从字段名的字符串获取出对应的数组
$temp = array();
foreach ($arr as $index => $val) {
$temp[$index] = $val[$field];
}
$args[$key] = $temp;
} else if (is_array($field)) { //自建
//如果使用的是规定好的想要自定义数组,那么进行独特处理
if (isset($field['function']) && isset($field['field'])) {
$fieldName = $field['field'];
switch ($field['function']) {
case 'chinese_sort': //如果使用中文名称来进行排序,转换字符格式
$temp = array();
foreach ($arr as $index => $val) {
$temp[$index] = iconv('utf-8', 'GB2312//IGNORE', $val[$fieldName]);;
}
$args[$key] = $temp;
break;
}
}
}
}
$args[] = &$arr;//引用值 todo 重点是这一步!!
call_user_func_array('array_multisort', $args);
return array_pop($args);
}
使用示例:
$matchHb = self::sortArrByManyField($matchHb,
'sort_type', SORT_ASC,
'match_per', SORT_DESC,
['field' => 'name', 'function' => 'chinese_sort'], SORT_STRING
);
print_r($matchHb);