一个有用的PHP二维数组排序函数(array_multisort)
在做论坛回复的时候,通常要显示回复的楼层号
,如"沙发","板凳","3楼","四楼"等。
因为回复表中并没有存这个楼层号
,所以只能根据回复时间排序然后算出楼层号,但是前台显示中,一个帖子的回复列表要按照点赞数量排序,所以想着先按时间查询算出楼层号,然后根据点赞数量排序数组,显示优先级:
点赞数量(从大到小) > 回复时间(从小到大)
php中的二维数组排序函数array_multisort
刚好能解决这个问题,看下官方说明:
array_multisort — 对多个数组或多维数组进行排序 bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC [, mixed $arg = SORT_REGULAR [, mixed $... ]]] ) array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。 每个数组之后不能指定两个同类的排序标志。每个数组后指定的排序标志仅对该数组有效 - 在此之前为默认值 SORT_ASC 和 SORT_REGULAR。 输入数组被当成一个表的列并以行来排序——这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。 本函数的参数结构有些不同寻常,但是非常灵活。第一个参数必须是一个数组。接下来的每个参数可以是数组或者是下面列出的排序标志。
还有官网的Demo
Example1
输出>>
Example2
输出>>
Example3
输出>>
从demo中看出这是个很厉害很灵活的函数,可以灵活的运用下,解决我的问题
/*
* @二维数组排序 by saonian
* @param $arr(必须) Array 要排序的数组
* @param $field1(必须) String 数组的某一个字段
* @param $field2(可选) String 数组的某一个字段
* @param $sort1 Int $field1排序规则 升序(4)or降序(3) 默认降序
* @param $sort2 Int $field2排序规则 升序(4)or降序(3) 默认降序
* @return Array 排序后的数组
*/
function array2_sort($arr,$field1,$field2='',$sort1='desc',$sort2='desc'){
if(in_array($sort1,array('desc','asc'))){
$arr_sort1 = $sort1 == 'desc' ? SORT_DESC : SORT_ASC;
}
if(in_array($sort2,array('desc','asc'))){
$arr_sort2 = $sort2 == 'desc' ? SORT_DESC : SORT_ASC;
}
$list = array();
if(!is_array($arr) || $field1 == ''){
return $list;
}
$arr2 = array();
foreach($arr as $k => $v){
if(!is_array($v) || !isset($v[$field1])){//不是二维数组,或者没找到对应的元素
break;
}else{
$arr2[] = $v[$field1];
}
}
if(!empty($field2)){
$arr3 = array();
foreach($arr as $k => $v){
if(!is_array($v) || !isset($v[$field2])){//不是二维数组,或者没找到对应的元素
break;
}else{
$arr3[] = $v[$field2];
}
}
}
if(!empty($arr3)){
array_multisort($arr2, $arr_sort1, $arr3, $arr_sort2, $arr);
}else{
array_multisort($arr2, $arr_sort1, $arr);
}
return $arr;
}
写了个函数,方便直接使用,看下实例:
//comment_res:从mysql中按时间查询出的数组,并且计算好了楼层号
//up:点赞数量[第一个排序参数]
//addTime:回复时间[第二个排序参数]
//desc 按up降序[从大到小]
//asc 按addTime[从小到大]
$comment_res = array2_sort($comment_res,'up','addTime','desc','asc');
最后的结果如下
测试回复
@zousaisai 睡吧,睡吧,晚安[em_53]
@zousaisai 妹子你这么早睡觉的吗?
(~o~)zZ
@saonian [em_13]
@叶秋 忘了取消贪婪模式@saonian 呵呵
@叶秋 怎么回事?怎么没@到你呢?
@叶秋 要对php有信心,[em_13]
这样排序之后速度会不会很慢呢?