php数组排序函数的使用及理解

发布时间:2020/07/31 作者:天马行空 阅读(1039)

感觉php的排序函数有一堆,开发过程中比较迷茫,今天来屡屡这些排序函数。

1、值排序

排序方式
不保留索引
保留索引
升序
sort()asort()、natsort()、natcasesort()
降序rsort()arsort()
自定义函数usort()uasort()

对值升序的时需要注意有两个函数natsort()、natcasesort()-不区分大小写,这是专门用来处理自然排序法的。

<?php
$array1 = $array2 = array("img12.png", "img10.png", "img2.png", "img1.png");

asort($array1);
echo "标准排序:\n";
print_r($array1);

natsort($array2);
echo "\n自然排序:\n";
print_r($array2);
?>

图片.png

自定义函数排序:顾名思义,就是让你自己定义一个函数来指定排序的规则,至于你要升序还是降序,完全是根据你定的规则来排。


假如我们要对一个数组中的字符串,按照长度进行升序排列:

$arr = [
    'c'=>'ccc',
    'e'=>'eeeee',
    'b'=>'bb',
    'f'=>'ffffff',
    'd'=>'dddd',
    'a'=>'a',
    'g'=>'ggggggg',
];
//默认是升序,如果要降序就把-1和1反一下
function mySort($a,$b){
    $a_len = strlen($a);
    $b_len = strlen($b);
    if ($a_len == $b_len){
        return 0;
    }elseif ($a_len < $b_len){
        return -1;
    }elseif ($a_len > $b_len){
        return 1;
    }
}
uasort($arr, "mySort");
echo '<pre>';print_r($arr);exit();

执行结果:

图片.png

对于mySort()这个函数,手册上是这样描述的:在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数。

这个描述很容易把人弄晕,其实他说的是一个默认规则。当第一个参数小于第二个参数的时候,你返回-1,等于的时候返回0,大于的时候返回1,只要按照这个规则,那出来的结果就是升序。要想降序怎么办?直接把-1和1对换一下位置就能实现,不要总扣手册上的字眼,自己动手试验一下就知道了。


有了自定义函数指定排序规则,要对二维数组排序就好办了。假如要对用户按照年龄升序排序:

$arr = [
    'a'=>['username'=>'张三','age'=>20],
    'b'=>['username'=>'李四','age'=>50],
    'c'=>['username'=>'王五','age'=>32],
    'd'=>['username'=>'刘六','age'=>41],
];

function mySort($a,$b){
    if ($a['age'] == $b['age']){
        return 0;
    }elseif ($a['age'] < $b['age']){
        return -1;
    }elseif ($a['age'] > $b['age']){
        return 1;
    }
}
uasort($arr, "app\www\controller\mySort");//使用命名空间
echo '<pre>';print_r($arr);exit;

执行结果:

图片.png


2、键排序

排序方式
保留索引
升序
ksort()
降序krsort()
自定义函数uksort()


3、自己实现的一个排序函数

function my_sort($arr,&$res=[]){
    $a1 = $res?end($res):array_shift($arr);
    $a2 = array_shift($arr);
   
    $result = mySort($a1, $a2);
    if ($result == 0){//一样长
        if (empty($res)) {//为空
            $res[] = $a1;
            $res[] = $a2;
        }else{
            $res[] = $a2;
        }
    }elseif ($result == -1){//第一个短
        if (empty($res)) {//为空
            $res[] = $a1;
            $res[] = $a2;
        }else{
            $res[] = $a2;
        }
    }elseif ($result == 1){//第一个长
        
        if (empty($res)) {//为空
            $res[] = $a2;
            $res[] = $a1;
        }else{
            $check = 0;
            for ($i = count($res)-2;$i>=0;$i--){
                $result = mySort($a2, $res[$i]);
                if ($result == 0 || $result == 1) {
                    $check = 1;
                    array_splice($res, $i+1, 0 , $a2);
                    break;
                }
            }
            if ($check == 0){
                array_splice($res, 0, 0 , $a2);
            }
            
        }
    }
    
    if (!empty($arr)){
        my_sort($arr, $res);
    }
    
    return $res;
}
$arr = my_sort($arr);
dump($arr);


关键字php 算法 排序