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

16-12-16 00:41 字数 1830 阅读 8332 已编辑

在做论坛回复的时候,通常要显示回复的楼层号,如"沙发","板凳","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

输出>> res_1

Example2 sort_2

输出>> res_2

Example3 sort_3

输出>> res_3

从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');

最后的结果如下

排序结果

1人点赞>
关注 收藏 改进 举报
11 条评论
排序方式 时间 投票
Up骚年

测试回复

Up骚年

@zousaisai 睡吧,睡吧,晚安[em_53]

Up骚年

@zousaisai 妹子你这么早睡觉的吗?

zousaisai

(~o~)zZ

Up骚年
啦啦啦啦
叶秋

@saonian [em_13]

Up骚年

@叶秋 忘了取消贪婪模式@saonian 呵呵

Up骚年

@叶秋 怎么回事?怎么没@到你呢?

Up骚年

@叶秋 要对php有信心,[em_13]

叶秋

这样排序之后速度会不会很慢呢?

Up骚年
回复1楼: 应该会比查询数据库快一点吧,如果数据量很大的话。主要的瓶颈就在mysql这一块。用php处理数组速度应该很快。毕竟php7的性能还是很不错的。
请登录后发表评论
站长 @ 十七度
文章
380
粉丝
23
喜欢
190
收藏
31
排名 : 1
访问 : 127.89万
私信