php 根据时间排序,接近的时间排在前面,过去的时间排在后面

2023-12-14 18:26:07

产品需求,有一个开放日的活动,时间是多选,且一个时间不能超过24小时,不能跨天,不能相等,后台没问题了,接口调取数据的时候麻烦点,因为刚开始时间存的json字段,后面改为添加一个时间表
时间字段有:stime:开始时间,etime:结束时间

// 接收的时间因为前台可以切换月份查看数据
$deta = $this->request->post('deta'); // 2023-12-10
// 转为年月
$dateParam = date('Y-m',strtotime($deta));
$currentMonthStart = $dateParam;
$currentMonthStart = date('Y-m-d 00:00:00', strtotime($currentMonthStart));
$currentMonthEnd = date('Y-m-t 23:59:59', strtotime($currentMonthStart));
// 注释的内容是上一测试的方法
$result = opmodel::alias('a')->join('opendaytime op', 'op.openday_id = a.id', 'left')
    ->where([
        'a.switch'=>1,
        'op.stime'=>['>',$currentMonthStart],
        'op.etime'=>['<',$currentMonthEnd]
    ])
    // 将 GROUP_CONCAT(DATE_FORMAT(op.stime, "%Y-%m-%d"))转换为年月日
//            ->field('a.*,GROUP_CONCAT(op.id) as opid,CONCAT("[", GROUP_CONCAT(JSON_OBJECT( "etime", DATE_FORMAT(op.etime, "%Y-%m-%d %H:%i:%s"),"stime", DATE_FORMAT(op.stime, "%Y-%m-%d %H:%i:%s"))), "]") as optime')
    ->field('a.*,op.id as opid,op.stime,op.etime,op.openday_id')
//            ->group('a.id')
    ->order('stime')
//            ->fetchSql()
    ->paginate($limit,$pages)->toArray();
// 根据openday_id将相同的数据归为一个数组
 $newData = [];
 foreach ($result['data'] as $item) {
     $opendayId = $item['openday_id'];
     if (!isset($newData[$opendayId])) {
         $newData[$opendayId] = [
             'id'=> $item['id'],
             'openday_id' => $opendayId,
             'name' => $item['name'],
             'activityimage' => $item['activityimage'],
             'school_id'=> $item['school_id'],
             'activityaddress'=> $item['activityaddress'],
             'quota'=> $item['quota'],
             'weigh'=> $item['weigh'],
             'opid'=> $item['opid'],
             'optime' => [],
         ];
     }
     $newData[$opendayId]['optime'][] = [
         'stime' => $item['stime'],
         'etime' => $item['etime'],
     ];
 }
		// 当前时间
        $currentTimestamp = strtotime(date('Y-m-d 00:00:00'));
        // 循环处理时间,添加未来时间futuretime和过去时间pasttime
        foreach ($newData as &$activity) {
            $activity['futuretime'] = ''; // 未来时间
            $activity['pasttime'] = []; // 过去时间
            foreach ($activity['optime'] as &$optime) {
                $startTime = strtotime($optime['stime']);
                
                if ($startTime < strtotime('+1 week', $currentTimestamp) && $startTime >= $currentTimestamp ) {
                    if (empty($activity['futuretime'])) {
                        $activity['futuretime'] = $startTime;
                    }
                }else{
                    $activity['pasttime'][] = $startTime;
                }
                // $ymd 暂未使用
                $ymd = date('Y-m-d', strtotime($optime['stime']));
                $_ymd = date('Y-m', strtotime($optime['stime']));
                $hm = date('H:i', strtotime($optime['stime'])) .'-'.date('H:i', strtotime($optime['etime']));
                if (!$activity['currentmonth']) {
                    $activity['currentmonth'] = explode('-', $_ymd);
                }
                // 特殊需求 展示时间
                $activity['ymdhm'][] = [
                    'ymd' => $_ymd,
                    'hm' => $hm,
                ];
            }
            // 前台点击查看的月份
            $activity['cktime'] = date('Y-m',strtotime($activity['optime'][0]['stime']));
            // 统计当前月份的场次
            $activity['counttime'] = count($activity['ymdhm']);
            $activity['school_name'] = $activity['school_id'];
            // 可去可不去
            unset($activity['openjson']);
            // 如果futuretime没有数据,就将最后一个日期放入
            if (empty($activity['futuretime'])) {
                $lastOptime = end($activity['optime']);
                $lastStartTime = strtotime($lastOptime['stime']);
                $activity['futuretime'] = $lastStartTime;
            }
        }
		// 根据字段排序
        usort($newData, function($a, $b) use ($currentTimestamp) {
            if ($a['futuretime'] < $currentTimestamp) {
                return 1;
            } elseif ($b['futuretime'] < $currentTimestamp) {
                return -1;
            } else {
                return $a['futuretime'] - $b['futuretime'];
            }
        });
        $result['data'] = $newData;

打印结果

array:6 [
  0 => array:17 [
    "id" => 26
    "openday_id" => 26
    "name" => "活动02"
    "activityimage" => "活动图片"
    "school_id" => "学校名称"
    "activityaddress" => "地址"
    "quota" => "10000"
    "weigh" => 26
    "opid" => 30
    "optime" => array:2 [
      0 => array:3 [
        "stime" => "2023-12-13 09:00:00"
        "etime" => "2023-12-13 17:00:00"
      ]
      1 => array:3 [
        "stime" => "2023-12-14 09:00:00"
        "etime" => "2023-12-14 17:00:00"
      ]
    ]
    "futuretime" => 1702515600
    "pasttime" => array:1 [
      0 => 1702429200
    ]
    "currentmonth" => array:2 [
      0 => "2023"
      1 => "12"
    ]
    "ymdhm" => array:2 [
      0 => array:2 [
        "ymd" => "2023-12"
        "hm" => "09:00-17:00"
      ]
      1 => array:2 [
        "ymd" => "2023-12"
        "hm" => "09:00-17:00"
      ]
    ]
    "cktime" => "2023-12"
    "counttime" => 2
    "school_name" => "学校名称"
  ]
  1 => array:17 [
    "id" => 27
    "openday_id" => 27
    "name" => "活动03"
    "activityimage" => "活动图片"
    "school_id" => "学校名称"
    "activityaddress" => "地址"
    "quota" => "10000"
    "weigh" => 27
    "opid" => 32
    "optime" => array:3 [
      0 => array:3 [
        "stime" => "2023-12-15 09:00:00"
        "etime" => "2023-12-15 00:00:00"
      ]
      1 => array:3 [
        "stime" => "2023-12-16 09:00:00"
        "etime" => "2023-12-16 17:00:00"
      ]
      2 => array:3 [
        "stime" => "2023-12-17 09:00:00"
        "etime" => "2023-12-17 17:00:00"
      ]
    ]
    "futuretime" => 1702602000
    "pasttime" => []
    "currentmonth" => array:2 [
      0 => "2023"
      1 => "12"
    ]
    "ymdhm" => array:3 [
      0 => array:2 [
        "ymd" => "2023-12"
        "hm" => "09:00-00:00"
      ]
      1 => array:2 [
        "ymd" => "2023-12"
        "hm" => "09:00-17:00"
      ]
      2 => array:2 [
        "ymd" => "2023-12"
        "hm" => "09:00-17:00"
      ]
    ]
    "cktime" => "2023-12"
    "counttime" => 3
    "school_name" => "学校名称"
  ]
  2 => array:17 [
    "id" => 29
    "openday_id" => 29
    "name" => "活动05"
    "activityimage" => "活动图片"
    "school_id" => "学校名称"
    "activityaddress" => "地址"
    "quota" => "10000"
    "weigh" => 29
    "opid" => 36
    "optime" => array:1 [
      0 => array:3 [
        "stime" => "2023-12-18 09:00:00"
        "etime" => "2023-12-18 17:00:00"
      ]
    ]
    "futuretime" => 1702861200
    "pasttime" => []
    "currentmonth" => array:2 [
      0 => "2023"
      1 => "12"
    ]
    "ymdhm" => array:1 [
      0 => array:2 [
        "ymd" => "2023-12"
        "hm" => "09:00-17:00"
      ]
    ]
    "cktime" => "2023-12"
    "counttime" => 1
    "school_name" => "学校名称"
  ]
  3 => & array:17 [
    "id" => 30
    "openday_id" => 30
    "name" => "活动06"
    "activityimage" => "活动图片"
    "school_id" => "学校名称"
    "activityaddress" => "地址"
    "quota" => "10000"
    "weigh" => 30
    "opid" => 37
    "optime" => array:1 [
      0 => & array:3 [
        "stime" => "2023-12-19 09:00:00"
        "etime" => "2023-12-19 17:00:00"
      ]
    ]
    "futuretime" => 1702947600
    "pasttime" => []
    "currentmonth" => array:2 [
      0 => "2023"
      1 => "12"
    ]
    "ymdhm" => array:1 [
      0 => array:2 [
        "ymd" => "2023-12"
        "hm" => "09:00-17:00"
      ]
    ]
    "cktime" => "2023-12"
    "counttime" => 1
    "school_name" => "学校名称"
  ]
  4 => array:17 [
    "id" => 25
    "openday_id" => 25
    "name" => "活动01"
    "activityimage" => "活动图片"
    "school_id" => "学校名称"
    "activityaddress" => "地址"
    "quota" => "10000"
    "weigh" => 25
    "opid" => 29
    "optime" => array:1 [
      0 => array:3 [
        "stime" => "2023-12-13 09:00:00"
        "etime" => "2023-12-13 17:00:00"
      ]
    ]
    "futuretime" => 1702429200
    "pasttime" => array:1 [
      0 => 1702429200
    ]
    "currentmonth" => array:2 [
      0 => "2023"
      1 => "12"
    ]
    "ymdhm" => array:1 [
      0 => array:2 [
        "ymd" => "2023-12"
        "hm" => "09:00-17:00"
      ]
    ]
    "cktime" => "2023-12"
    "counttime" => 1
    "school_name" => "学校名称"
  ]
  5 => array:17 [
    "id" => 28
    "openday_id" => 28
    "name" => "测试活动04-测试已过时间"
    "activityimage" => "活动图片"
    "school_id" => "学校名称"
    "activityaddress" => "地址"
    "quota" => "10000"
    "weigh" => 28
    "opid" => 35
    "optime" => array:2 [
      0 => array:3 [
        "stime" => "2023-12-08 09:00:00"
        "etime" => "2023-12-08 17:00:00"
      ]
      1 => array:3 [
        "stime" => "2023-12-09 09:00:00"
        "etime" => "2023-12-09 17:00:00"
      ]
    ]
    "futuretime" => 1702083600
    "pasttime" => array:2 [
      0 => 1701997200
      1 => 1702083600
    ]
    "currentmonth" => array:2 [
      0 => "2023"
      1 => "12"
    ]
    "ymdhm" => array:2 [
      0 => array:2 [
        "ymd" => "2023-12"
        "hm" => "09:00-17:00"
      ]
      1 => array:2 [
        "ymd" => "2023-12"
        "hm" => "09:00-17:00"
      ]
    ]
    "cktime" => "2023-12"
    "counttime" => 2
    "school_name" => "学校名称"
  ]
]

文章来源:https://blog.csdn.net/weixin_43018356/article/details/134998387
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。