二维数组根据其中某些字段排序的问题

2 篇文章 0 订阅

背景:
按照一个月内学的课程和考试数之和进行排名,若之和相等,按照学习课程数和考试数相差度小的排在前面;
例如:员工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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值