摘要:前提给定一个二维数组,请根据指定的数组写出最优的排序。排序条件,指定数组如下估计大家都没有什么问题,排序嘛,简单的不要不要的方式一这应该是最简单的方式了,直接使用现成的函数,快捷的不要不要的。
前提
给定一个二维数组,请根据指定的数组key,写出最优的排序。排序条件age asc,sex desc,指定数组如下:
$arr = [ ["id"=>1, "age"=>1, "sex"=>6, "name"=>"a"], ["id"=>2, "age"=>3, "sex"=>1, "name"=>"c"], ["id"=>3, "age"=>3, "sex"=>1, "name"=>"b"], ["id"=>4, "age"=>2, "sex"=>1, "name"=>"d"], ];
估计大家都没有什么问题,排序嘛,简单的不要不要的:
方式一:array_multisort(array_column($arr,"age"),SORT_ASC,array_column($arr,"sex"), SORT_DESC, $mylist);
这应该是最简单的方式了,直接使用php现成的函数,快捷的不要不要的。
方式二:$sort = []; foreach($arr as $k=>$v) { $sort["age"][$k] = $v["age"]; $sort["sex"][$k] = $v["sex"]; } 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 ($orders as $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]); } } return implode("", $result); });
三种方式都可以,都比较简单,那么问题来了。
问题如果排序数组不是固定的呢,排序数组是动态从数据库查询出来,排序条件也不是固定的呢,那么我们肯定要封装函数,如果使用php内置函数:
function _sort(){ ...... array_multisort(...) }
这里我们就看出问题来了,array_multisort的参数不固定啊,使用有两个方法:func_get_args()和...$arg,放弃func_get_args(),因为没有办法使用。如果是自己写的函数也建议不用,因为使用func_get_args(),容易让函数看上去是不需要传递参数的。如果你在写大量代码的时候,进行缩放的时候,也很难了解这个函数参数大概细节。这是非常不方便的。所以函数如下:
function _sort( &$arr, $sorts ) { $sortParams = []; foreach ( $sorts as $key => $v ) { $sortParams[] = array_column($arr, $key); $sortParams[] = strcasecmp($v, "desc") === 0 ? SORT_DESC : SORT_ASC; } array_push($sortParams, $arr); array_multisort(...$sortParams); } _sort(["age"=>"asc","name"=>"desc","sex"=>"asc"]);
看是去很好对吧,但是运行才知道,没有效果,难道是array_multisort不支持...$arg,查看了手册,没看到说明,
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/28964.html
摘要:之前看到一道面试题,大概意思是尽可能的写出来给二维数组按照某个字段值排序的功能比如说是下面数组结构按照年龄对用户进行排序大家第一眼感觉应该是用循环,然后用冒泡排序之类的去计算但这一道题显然不是去考察大众都能想到的它应该是想考一下求职者对基本 之前看到一道面试题,大概意思是尽可能的写出来给二维数组按照某个字段值排序的功能;比如说是下面数组结构: $users = [ [name ...
摘要:需求现在有下面一组二维数组青叶我是青叶合肥男足球棒球需要将处于第二维键名为,其值相同的数组的合并形成一个新的数组。 需求 现在有下面一组二维数组: array(8) { [0]=> array(2) { [name]=> string(4) name [value]=> string(6) 青叶 } [1]=> array(2) { ...
阅读 3142·2021-11-23 10:02
阅读 3117·2021-11-16 11:53
阅读 3092·2021-09-23 11:21
阅读 3368·2019-08-30 13:02
阅读 1621·2019-08-29 16:18
阅读 1556·2019-08-29 12:55
阅读 1456·2019-08-26 12:24
阅读 2084·2019-08-26 10:36