当前位置: 首页 > 后端技术 > PHP

php二维数组排序_1

时间:2023-03-29 15:19:03 PHP

前提给定一个二维数组,请根据指定的数组键写出最优排序。排序条件ageasc,sexdesc,指定数组如下:$arr=[['id'=>1,'age'=>1,'sex'=>6,'name'=>'a'],['id'=>2,'age'=>3,'sex'=>1,'name'=>'c'],['id'=>3,'age'=>3,'性别'=>1,'姓名'=>'b'],['id'=>4,'年龄'=>2,'性别'=>1,'姓名'=>'d'],];估计没人有什么问题,排序,很简单,不要了:方法一:array_multisort(array_column($arr,'age'),SORT_ASC,array_column($arr,'sex'),SORT_DESC,$我的名单);这个应该是最简单的方法了,直接用php的现成函数,速度快,没??必要。方法二:$sort=[];foreach($arras$k=>$v){$sort['age'][$k]=$v['age'];$sort['性别'][$k]=$v['性别'];}array_multisort($sort['age'],SORT_ASC,$sort['sex'],SORT_DESC,$mylist);嗯,勉强能读懂,但感觉有点奇异的恩典。方法三:$orders=['age'=>'asc','sex'=>'desc'];usort($arr,function($a,$b)use($orders){$result=[];foreach($ordersas$key=>$value){list($field,$sort)=[$key,$value];if(!(isset($a[$field])&&isset($b[$field]))){continue;}if(strcasecmp($sort,'desc')===0){$tmp=$a;$a=$b;$b=$tmp;}if(is_numeric($a[$field])&&is_numeric($b[$field])){$result[]=$a[$field]-$b[$field];}else{$result[]=strcmp($a[$field],$b[$field]);}}returnimplode('',$result);});三种方法都是可以的,而且都比较简单,那么问题来了。Question如果排序数组不固定,排序数组是动态从数据库中查询出来的,排序条件不固定,那么就要封装函数。如果使用php内置函数:function_sort(){...array_multisort(...)}这里就可以看出问题所在。array_multisort的参数不是固定的。有两种方法可供使用:func_get_args()和...$arg。放弃func_get_args()因为没有办法使用它。如果是自己写的函数,不推荐,因为使用func_get_args(),很容易让函数看起来不需要传参。如果你正在编写大量代码,那么在缩放时很难理解这个函数参数的大致细节。这很不方便。所以函数如下:function_sort(&$arr,$sorts){$sortParams=[];foreach($sortsas$key=>$v){$sortParams[]=array_column($arr,$key);$sortParams[]=strcasecmp($v,'desc')===0?SORT_DESC:SORT_ASC;}array_push($sortParams,$arr);array_multisort(...$sortParams);}_sort(['年龄'=>'asc','姓名'=>'desc','性别'=>'asc']);看起来不错,但只有运行它才会起作用。会不会是array_multisort不支持...$arg,我查了手册,没看到说明,那就放弃内置函数,自己写:functionarrayOrderBy(array&$arr,$order=null){if(is_null($order)){返回$arr;}$orders=explode(',',$order);usort($arr,function($a,$b)use($orders){$result=array();foreach($ordersas$value){list($field,$sort)=array_map('trim',explode('',trim($value)));if(!(is设置($a[$field])&&isset($b[$field]))){继续;}if(strcasecmp($sort,'desc')===0){$tmp=$a;$a=$b;$b=$tmp;}if(is_numeric($a[$field])&&is_numeric($b[$field])){$result[]=$a[$field]-$b[$field];}else{$result[]=strcmp($a[$field],$b[$field]);}}arrayOrderBy($arr,'年龄升序,性别升序,姓名降序');其实这是一道面试题,大概意思就是用PHP写一个类似于mysql的orderby的函数。其实很简单。参考https://stackoverflow.com/que...