PHP 는 두 가지 수업 방식 을 실현 한다.

두 가지 수업 방식:
매주 의 고정 시간 수업(예:모두 20 시간,매주 6,일요일 아침 8 시-10 시 에 수업 합 니 다.만약 에 오늘 토요일 새벽 1 시 에 수업 을 배정 하 는 데 도 오늘부터)모두 몇 주 동안 수업 을 해 야 합 니 다.매주 수업 시간 은 비교적 개성 화 됩 니 다(예:모두 3 주,첫째 주 월요일 화요일 아침 8 시-10 시 에 수업 을 합 니 다.둘째 주 수요일 목요일 오후 8 시-10 시 에 수업 합 니 다.셋째 주 일요일 낮 11 시-12 시 에 수업 합 니 다.)
첫 번 째 수업 은 비교적 실현 하기 쉽 고 간단 한 코드 는 다음 과 같다.

/**
     *       
     *
     * @param  int $startDate           
     * @param  array $timeList       
       [
        {
            "start_at": "09:09", //    
            "end_at": "10:09",   //    
            "week_at": 1         //  
        },
        {
            "start_at": "12:09", //    
            "end_at": "13:09",   //    
            "week_at": 1         //  
        },
        {
            "start_at": "09:09",
            "end_at": "10:09",
            "week_at": 5
        }
       ]
     * @param  int $amount       
     * @param  int $skipHoliday      
     *
     * @return array
     */
    public function generateDateList($startDate, $timeList, $amount, $skipHoliday = 0)
    {
        //          
        $startDateWeek = intval(date('N', $startDate));
 
        //        week_at  key     
        foreach ($timeList as $item) {
 
            $weekAt = $item['week_at'];
            
            array_splice($item, 0, 0, $weekAt);
            $key = array_shift($item);
            $weeksTime[$key][] = $item;
            $item = null;
        }
 
        unset($timeList);
 
        if (empty($weeksTime)) {
            $this->addError('        ');
            return false;
        }
 
        //      ,            
        if ($skipHoliday) {
            $holiday = new Holiday();
            $holidayData = $holiday->getHolidayList($startDate);
            $holiday = null;
            unset($holiday);
        }
 
        $nowTime = time();
        $list = array();
 
        for ($weekStartTime = $startDate, $count = 0; $count < $amount; $weekStartTime += 86400 * 7) {
 
            //$currentWeek :  
            foreach ($weeksTime as $currentWeek => $weekTime) {
 
                foreach ($weekTime as $time) {
 
                    //          
                    $currentDateTime = $weekStartTime + (($startDateWeek <= $currentWeek ? ($currentWeek - $startDateWeek) : (7 - $startDateWeek + $currentWeek)) * 86400);
                    //      =      + ((        <=         ? (        -        ) :(7 -         +        )) * 86400)
                    //      
                    if ($skipHoliday && !empty($holidayData)) {
                        $startUnix = $currentDateTime + $time['start_at'] * 3600;  //    
                        $endUnix = $currentDateTime + $time['end_at'] * 3600;     //    
 
                        $skip = false;
 
                        //       ,                
                        foreach ($holidayData as $item) {
                            if (($item['start_at'] < $endUnix && $item['end_at'] > $startUnix) || ($item['start_at'] === $startUnix && $item['end_at'] === $endUnix)) {
                                $skip = true;
                                continue;
                            }
                        }
 
                        if ($skip) {
                            continue;
                        }
                    }
 
                    $currentDate = date('Y/m/d', $currentDateTime);
                    $startAt = strtotime($currentDate . $time['start_at'] . ':00');
                    $endAt = strtotime($currentDate . $time['end_at'] . ':00');
 
                    if($startAt < $nowTime || $endAt < $nowTime){
                        $this->addError('            ');
                        return false;
                    }
 
                    $list[] = [
                        'date_at' => $currentDateTime, //  
                        'week_at' => $currentWeek,     //  
                        'start_at' => $startAt,
                        'end_at' => $endAt
                    ];
 
                    $count++;
 
                    if ($count >= $amount) {
                        break 3;
                    }
                }
            }
        }
 
        $weeksTime = null;
        unset($weeksTime);
 
        return $list;
    }
(예 를 들 어 데이터 구 조 를 보 여 주 는 데 만 사용)총 5 교시 에 6-25 일부 터 수업 을 시작 하면 매주 1,토요일 에 수업 을 한다.

(예 를 들 어 데이터 구조 만 보 여 주 는 것)수업 결 과 는 다음 과 같다.

두 번 째 수업 방식 은 조금 번 거 롭 습 니 다.간단 한 코드 는 다음 과 같 습 니 다.

/**
     *       
     *
     * @param  int $startDate           
     * @param  array $taskList     
    [
        {
            "start_at": "09:09", //      
            "end_at": "10:09",   //    
            "week_at": 1,        //  
            "week_number": 1     //   
        },
        {
            "start_at": "09:09",
            "end_at": "10:09",
            "week_at": 2,
            "week_number": 1
        },
        {
            "start_at": "09:09",
            "end_at": "10:09",
            "week_at": 1,
            "week_number": 3
        }
    ]
     *
     * @return array
     */
    public function generateDateList($startDate, $taskList)
    {
        //          
        $startDateWeek = intval(date('N', $startDate));
 
        $list = [];
        $nowTime = time();
        $weekSign = $week = 0;
 
        foreach($taskList as $key => $task){
 
            if($task['week_number'] > $weekSign && $task['week_number'] != $week){
                $weekSign = $task['week_number'] - $week;
            }
 
            //            $key == 0:                  
            if($key == 0 || $task['week_number'] == $week){
 
                if($task['week'] >= $startDateWeek){
                    $task['date_at'] = $startDate +
                        (($weekSign - 1) * 7 + ($task['week'] - $startDateWeek)) * 86400;
                }else{
                    $task['date_at'] = $startDate +
                        (($weekSign) * 7 - ($startDateWeek - $task['week'])) * 86400;
                }
            }else{
                if($task['week'] > $startDateWeek){
                    $task['date_at'] = $startDate +
                        (($weekSign) * 7 + ($task['week'] - $startDateWeek)) * 86400;
                }else{
                    $task['date_at'] = $startDate +
                        (($weekSign) * 7 - ($startDateWeek - $task['week'])) * 86400;
                }
            }
 
            $startDateWeek = intval(date('N', $task['date_at']));
 
            $week = $task['week_number'];
 
            $startDate = $task['date_at'];
 
            $dateAt = date('Y/m/d', $task['date_at']);
 
            $startAt = strtotime($dateAt . '00:00:00');
            if($task['start_at']){
                $startAt = strtotime($dateAt . $task['start_at'] . ':00');
            }
 
            $endAt = strtotime($dateAt . '23:59:59');
            if($task['end_at']){
                $endAt = strtotime($dateAt . $task['end_at'] . ':00');
            }
 
            if($startAt < $nowTime || $endAt < $nowTime){
                $this->addError('            ');
                return false;
            }
 
            $task['start_at'] = $startAt;
            $task['end_at'] = $endAt;
 
            //      
            $list[] = [
                    'date_at' => $task['date_at'],
                    'week_at' => $task['week'],
                    'start_at' => $startAt,
                    'end_at' => $endAt
                ];
        }
 
        return $list;
    }
(예 를 들 어 데이터 구 조 를 보 여 주 는 데 만 사용)수업 배정 데이터:

(예,데이터 구조 만 보 여 줍 니 다) 수업 결과:

PHP 가 두 가지 배 강 방식 을 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 PHP 가 배 강 내용 을 실현 하 는 것 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기