由于php官方并没有提供
二维数组多字段排序
的函数,但是细心的朋友会发现其实array_multisort
函数是可以实现多字段排序的,但是得预先定义好每个参与排序的字段的数组,所以本函数的封装只是为了方便复用
和动态
的根据参数传递排序的字段命及先后顺序及每个字段排序的方式进行排序知识点1:array_multisort() 函数返回一个排序数组。您可以输入一个或多个数组。函数先对第一个数组进行排序,接着是其他数组
注意:需要确认服务器不要禁用
eval
函数,关于eval函数的安全问题
,有朋友发现更好的实现方案请联系我.
直接上代码
/**
* 二维数组根据多个字段排序
*
* @param array $array 要排序的数组
* @param array $keys 要排序的键字段(数组,很清楚先后顺序,可以传递每个字段不同的排序类型)
* @param int $sort 默认排序类型 SORT_ASC SORT_DESC
*
* @return array 排序后的数组
* @author hcg
*/
function arraySort($array, $keys, $sort = SORT_DESC)
{
$keys_ = [];
$fun_str = 'array_multisort(';
foreach ($keys as $key1 => $value1) {
$k1 = (is_array($value1) && isset($value1[0]) ? $value1[0] : $value1);
$v1 = (is_array($value1) && isset($value1[1]) ? $value1[1] : $sort);
$fun_str .= '$keys_[\'' . $k1 . '\'],' . $v1 . ',';
foreach ($array as $key2 => $value2) {
$keys_[$value1][$key2] = $value2[$value1];
}
}
$fun_str .= '$array);';
eval($fun_str);
return $array;
}
使用方式示例
// 定义测试数据
$arr = array (
array (
'oe_number' => '22',
'oe_count' => '3',
),
array (
'oe_number' => 0,
'oe_count' => '0',
),
array (
'oe_number' => 23,
'oe_count' => '0',
),
array (
'oe_number' => 22,
'oe_count' => '0',
),
array (
'oe_number' => 22,
'oe_count' => '5',
),
);
// 排序
$arr = arraySort($staff_review_score, [['oe_number',SORT_DESC], 'oe_count']);
排序后的数组打印
array (
array (
'oe_number' => 23,
'oe_count' => '0',
),
array (
'oe_number' => 22,
'oe_count' => '5',
),
array (
'oe_number' => '22',
'oe_count' => '3',
),
array (
'oe_number' => 22,
'oe_count' => '0',
),
array (
'oe_number' => 0,
'oe_count' => '0',
),
)