zuixinyan 2019-06-27
给定一个二维数组,请根据指定的数组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,查看了手册,没看到说明,
如果要想让v2也进行排序,需要把k2和v2组装成新的类,作为k2,才能参与比较。// 1.1 告诉干活的人 输入流位置 读取hdfs中的文件。每一行解析成一个<k,v>。每一个键值对调用一次map函数