php 二维数组排序
前提
给定一个二维数组,请根据指定的数组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
,查看了手册,没看到说明,
相关推荐
wordmhg 2020-04-09
wangqing 2020-04-06
blackeagleoht 2019-05-04
ztyzly00 2020-07-18
killgod 2020-06-14
小惠 2020-06-05
Oudasheng 2020-06-04
从零开始 2020-06-05
litterfrog 2020-05-30
老谢的自留地 2020-05-09
wulaxiaohei 2020-05-05
cyyking 2020-05-03
aaLiweipeng 2020-04-15
Pinkr 2020-03-12
dushine00 2020-02-21
dbhllnr 2020-02-18
zhujiangtaotaise 2020-01-26
chenchuang 2020-01-25