一个有用的PHP二维数组排序函数(array_multisort)

saonian 发布于 16-12-16 00:41 已修改 4540 点击
在做论坛回复的时候,通常要显示回复的`楼层号`,如"沙发","板凳","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** ![sort_1](//www.shiqidu.com/ueditor/php/upload/image/20161216/1481817902986123.png "sort_1") **输出>>** ![res_1](//www.shiqidu.com/ueditor/php/upload/image/20161216/1481817902982042.png "res_1") **Example2** ![sort_2](//www.shiqidu.com/ueditor/php/upload/image/20161216/1481817902235016.png "sort_2") **输出>>** ![res_2](//www.shiqidu.com/ueditor/php/upload/image/20161216/1481817902252034.png "res_2") **Example3** ![sort_3](//www.shiqidu.com/ueditor/php/upload/image/20161216/1481817902629091.png "sort_3") **输出>>** ![res_3](//www.shiqidu.com/ueditor/php/upload/image/20161216/1481817902519205.png "res_3") 从demo中看出这是个很厉害很灵活的函数,可以灵活的运用下,解决我的问题 ```php /* * @二维数组排序 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; } ``` 写了个函数,方便直接使用,看下实例: ```php //comment_res:从mysql中按时间查询出的数组,并且计算好了楼层号 //up:点赞数量[第一个排序参数] //addTime:回复时间[第二个排序参数] //desc 按up降序[从大到小] //asc 按addTime[从小到大] $comment_res = array2_sort($comment_res,'up','addTime','desc','asc'); ``` **最后的结果如下** ![排序结果](//www.shiqidu.com/ueditor/php/upload/image/20161216/1481819975877617.png "排序结果")
11 评论

请登录后发表评论

saonian

all or nothing, now or never.

文章
回复
粉丝