发布时间:2020/07/31 作者:天马行空 阅读(1340)
感觉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); ?>
自定义函数排序:顾名思义,就是让你自己定义一个函数来指定排序的规则,至于你要升序还是降序,完全是根据你定的规则来排。
假如我们要对一个数组中的字符串,按照长度进行升序排列:
$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();
执行结果:
对于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;
执行结果:
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);