背景:
按照一个月内学的课程和考试数之和进行排名,若之和相等,按照学习课程数和考试数相差度小的排在前面;
例如:员工1学习课程数10门,考试3门,员工2学习课程数8门,考试5门,之和都是13,但是员工2, 课程数和考试数相差度为3,小于员工1的相差度7,所以,在排行时,员工2排名在前面
主要函数
通过查阅PHP手册//说明:
//array_column() 返回input数组中键值为column_key的列, 如果指定了可选参数index_key,那么input数组中的这一列的值将作为返回数组中对应值的键。
array_column ( array $input , mixed $column_key [, mixed $index_key = null ] ) : array
//如:
//从结果集中取出last_name列,用相应的id作为键值
$last_names = array_column($records, 'last_name', 'id');
//说明:
//array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。
//哇,看了PHP手册之后突然发现。貌似,不用array_column也可,可能更方便了呢。。。就当多了解一个函数吧。。。。不亏不亏。。。。。。。
array_multisort ( array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags = SORT_REGULAR [, mixed $... ]]] ) : bool
//这一大串子看的我头大、不过举的例子简单明了。这里不解释了,直接往下看吧
测试数据
$data = array(
array('id'=>1,'uid'=>'wgg','course_count'=>7,'exam_count'=>5),
array('id'=>2,'uid'=>'sd','course_count'=>2,'exam_count'=>1),
array('id'=>3,'uid'=>'cds','course_count'=>6,'exam_count'=>6),
array('id'=>4,'uid'=>'rev','course_count'=>4,'exam_count'=>2),
array('id'=>5,'uid'=>'ptb','course_count'=>7,'exam_count'=>3),
array('id'=>6,'uid'=>'vgr','course_count'=>8,'exam_count'=>4)
);
获取列、排序
array_multisort() 需要一个包含列的数组,因此先取得列,然后排序
第一种方法
//这个是我最开始不知道怎么做,然后看了看大家的博客,参考着实现的
foreach ($data as $key => $value) {
$data[$key]['sum'] = $value['course_count']+$value['exam_count'];
$data[$key]['del'] = $value['course_count']-$value['exam_count'];
}
$sum = array_column($data, 'sum');
$del = array_column($data, 'del');
array_multisort($sum, SORT_DESC,$del, SORT_ASC, $data);
第二种方法(推荐)
//这是看过手册之后,是不是更精简!!!
$sum = $del = [];
foreach ($data as $key => $value) {
$sum[$key] = $value['course_count']+$value['exam_count'];
$del[$key] = $value['course_count']-$value['exam_count'];
}
//按照和按降序排列;若和相等,按相差度升序排列(相差度小的在前面)
array_multisort($sum, SORT_DESC,$del, SORT_ASC, $data);