php排序函数array_multisort详解

发布时间:2020/04/26 作者:天马行空 阅读(991)

定义
array_multisort() 函数返回排序数组。您可以输入一个或多个数组。函数先对第一个数组进行排序,接着是其他数组,如果两个或多个值相同,它将对下一个数组进行排序。
初看之下,感觉就是分别对多个数组按照指定的规则进行排序。然后我们实验一把:

$a1=array("Dog","Dog","Cat");
$a2=array("Pluto","Fido","Missy");
array_multisort($a1,SORT_ASC,$a2,SORT_ASC);
print_r($a1);
print_r($a2);
输出结果:
Array
(
    [0] => Cat
    [1] => Dog
    [2] => Dog
)
Array
(
    [0] => Missy
    [1] => Fido
    [2] => Pluto
)


$a1的排序没问题,但$a2并没有按照升序排呀,这些怎么回事,难道这个函数有bug,不是说好的可以对多个数组进行排序么?其实这个地方是一个误区,也是手册上没有说清楚的地方。我们仔细观察一下排序之前两个的数组对应关系,是这样的:
Dog=>Pluto
Dog=>Fido
Cat=>Missy
然后我们在看看排序之后两个数组的对应关系,是不是还是这个对应关系,对了,依然是这个关系。
$a,$b是两个数组,如果排序之后,$a数组的第3个元素被排到了第一位,那么$b的第三个元素不管他在$b中的大小都会排在第一位。
由此我们可以得出这个数组的排序都是根据第一个数组的值大小进行排序的,然后其他的数组都按照第一个数组的调整策略进行调整,交换相应的位置,只有当第一个数组出现了相同的值的时候,才会根据第二个数组中相同位置的值和对第二个数组设置的排序规则进行排序。可能有人就要问了,为什么要搞这么麻烦,有什么实际应用场景呢。好,那我们就来个实际的场景,对一组用户按照年龄降序排序、用户名升序排列,用户数据如下:
年龄20,user3
年龄21,user2
年龄20,user1
年龄22,user4

$array = array(
            array("id"=>1,"age"=>20,"username"=>"user3"),
            array("id"=>2,"age"=>21,"username"=>"user2"),
            array("id"=>3,"age"=>20,"username"=>"user1"),
            array("id"=>4,"age"=>22,"username"=>"user4")
        );
foreach ($array as $key=>$value){
     $age[$key] = $value['age'];
     $name[$key] = $value['username'];
}
array_multisort($age,SORT_NUMERIC,SORT_DESC,$name,SORT_STRING,SORT_ASC,$array);
print_r($array);
排序结果:
Array
(
    [0] => Array
        (
            [id] => 4
            [age] => 22
            [username] => user4
        )
    [1] => Array
        (
            [id] => 2
            [age] => 21
            [username] => user2
        )
    [2] => Array
        (
            [id] => 3
            [age] => 20
            [username] => user1
        )
    [3] => Array
        (
            [id] => 1
            [age] => 20
            [username] => user3
        )
)
关键字php 排序