工作笔记——一个常用的排序函数array_multisort();

最近在工作中遇到一个问题,需要查两个表得到数组,然后按照两个数组中的时间排序,最开始打算用数据库语句实现,但是一直找不到什么好的办法,找到了还有可能影响数据库性能,最终打算在php端处理。使用函数array_multisort();

一、array_multisort()的基本使用。

array_multisort()是一个功能很多的函数。首先,来看一下它的基本使用方式;

<?php
    $list = array('one'=>'10','two'=>'20','three'=>'20','four'=>10);
    array_multisort($list,SORT_DESC);//Array ( [three] => 20 [two] => 20 [four] => 10 [one] => 10 )
?>

这里将需要排序的数组放到第一个参数中,然后根据第二个参数(可选:SORT_ASC/SORT_DESC等)的规则进行排序,得到需要的数组$list.
函数第二个参数表示排序类型,我这里用的是倒序,下面还有(取自php.net):
排序类型标志:

SORT_REGULAR - 将项目按照通常方法比较(不修改类型)
SORT_NUMERIC - 按照数字大小比较
SORT_STRING - 按照字符串比较
SORT_LOCALE_STRING - 根据当前的本地化设置,按照字符串比较。 它会使用 locale 信息,可以通过 setlocale() 修改此信息。
SORT_NATURAL - 以字符串的”自然排序”,类似 natsort()
SORT_FLAG_CASE - 可以组合 (按位或 OR) SORT_STRING 或者 SORT_NATURAL 大小写不敏感的方式排序字符串。

二、解决问题

显然上面的使用还不足以满足我的需求,在解决我的问题时,我有两个数组,这两个数组的格式是相差不多的。我可以把它简化为:

    $name = array('mike','json','john','siri');
    $score = array('60','40','90','60');

我想按照分数将这些人从大到小排序,如果分数相同则再按照姓名排序;
然后调用函数:

    array_multisort($score,SORT_DESC,$name);

运行结果为:

    array(4) {[0]=>string(2)"90" [1]=>string(2)"60" [2]=>string(2)"60" [3]=> tring(2)"40"}
    array(4) {[0]=>string(4)"john" [1]=>string(5)"siri" [2]=>string(4)"mike" [3]=>string(4)"json"} 

结果可以看到,分数的确是排好序了,但是名字并不是我想要的正序顺序排序。

事实上,函数在执行的时候会把第一个数组按规定排序,第二个数组后面如果不规定排序方式,那么第二个数组将会按照第一个数组排序前的键一一对应的关系进行换位,如果是索引数组,索引将会重建。
为了验证这点,我将数组变为关联数组:

    $name = array('yi'=>'mike','er'=>'json','san'=>'john','si'=>'siri');
    $score = array('yi'=>'60','er'=>'40','san'=>'90','si'=>'60');

重新执行代码:

    array_multisort($score,SORT_DESC,$name);

再看运行结果:

    array(4){["san"]=>"90" ["yi"]=>"60" ["si"]=>"60" ["er"]=>"40"} 
    array(4){["san"]=>"john" ["yi"]=>"mike" ["si"]=>"siri" ["er"]=>"json"}

我们可以看到两个数组下标的一一对应关系是没有改变的。

问题还没有解决,
我尝试在第二个数组后面增加一个正序排序参数:

    array_multisort($score,SORT_DESC,$name,SORT_ASC);
    var_dump($score);
    var_dump($name);

数据执行结果为:

    array(4) {[0]=>"90" [1]=>"60" [2]=>"60" [3]=>"40"}
    array(4) {[0]=>"john" [1]=>"mike" [2]=>"siri" [3]=>"json"}

这里就能看到,siri和mike分数相同,但是他们根据名字首字母进行了排序,变成了我想要的结果。

猜你喜欢

转载自blog.csdn.net/qq409451388/article/details/77836596