婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHP實現兩種排課方式

PHP實現兩種排課方式

熱門標簽:合肥ai電銷機器人費用 400電話個人能不能辦理 上海400客服電話怎么申請 手機外呼系統什么原理 天津電銷外呼系統違法嗎 凱立德地鐵站地圖標注 銀行信貸電話機器人 溫州外呼系統招商 滄州電銷外呼系統價格

兩種排課方式:

固定每周的固定時間上課(例:共上20節,每周六、周日早上8點-10點上課。假如今天周六凌晨1點,那么排課也需要從今天開始)總共上幾個周,每周上課時間比較個性化(例:共上三周,第一周周一周二早上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日開始排課,每周一、周六上課:

(例子,只用來展示數據結構)排課結果為:


第二種排課方式稍微麻煩一點,簡要代碼如下:

/**
     * 生成日期列表
     *
     * @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實現排課內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 詳細分析PHP7與PHP5區別
  • php生成用戶密碼的兩種方式
  • php類中static與self的使用區別淺析
  • php如何用PDO操作大數據對象
  • php使用workman框架實現socket服務以及連接客戶端

標簽:酒泉 洛陽 赤峰 溫州 白城 金華 怒江 七臺河

巨人網絡通訊聲明:本文標題《PHP實現兩種排課方式》,本文關鍵詞  PHP,實現,兩種,排課,方式,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP實現兩種排課方式》相關的同類信息!
  • 本頁收集關于PHP實現兩種排課方式的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美国产日本视频| 不卡一区二区中文字幕| 99久久久久免费精品国产 | 91精品国产综合久久香蕉麻豆| 欧美精品一卡二卡| 国产一区二区电影| 亚洲精品成人少妇| 日韩你懂的在线播放| 日韩一区在线播放| 欧美电影免费观看高清完整版在 | 136国产福利精品导航| 色综合天天综合狠狠| 亚洲综合激情另类小说区| 精品欧美一区二区在线观看| 欧美亚洲一区二区在线观看| 白白色 亚洲乱淫| 国产成人在线视频网址| 青草国产精品久久久久久| 精品国免费一区二区三区| 在线观看91精品国产入口| 国产一区二区看久久| 成人听书哪个软件好| 国产精品1区2区| 国产在线精品不卡| 亚洲国产中文字幕| 久久亚洲一级片| 精品日本一线二线三线不卡| 久久九九全国免费| 一级精品视频在线观看宜春院 | 亚洲理论在线观看| 一区二区三区电影在线播| 日韩国产一区二| 国产sm精品调教视频网站| 国产精品性做久久久久久| 久久精品久久99精品久久| 成人爽a毛片一区二区免费| 97久久超碰国产精品| 欧美精品视频www在线观看 | 免费观看日韩电影| 99国产一区二区三精品乱码| 色偷偷成人一区二区三区91| 欧美一区二区三区影视| 欧美电视剧免费全集观看| 日韩毛片在线免费观看| 久久久三级国产网站| 成人精品免费网站| 欧美韩日一区二区三区| 久久99九九99精品| 日韩一区二区免费电影| 亚洲国产一区二区视频| 欧美在线综合视频| 中文字幕一区二区不卡| 国产成人av一区二区三区在线 | 欧美在线观看一区| 日韩一区日韩二区| 丁香网亚洲国际| 欧美激情一区在线| 成人av网站在线观看免费| 日韩视频一区二区| 日本视频一区二区三区| 欧美日韩一区二区三区高清| 亚洲精品水蜜桃| 久久一区二区视频| 国产一区二区三区免费播放| 国产日韩欧美激情| 国产乱码精品一区二区三区五月婷| 欧美精品一卡二卡| 国产真实精品久久二三区| 亚洲人精品午夜| 欧美性一二三区| 亚洲第一电影网| 精品sm在线观看| 91麻豆国产在线观看| 中文字幕一区日韩精品欧美| 国产在线麻豆精品观看| 1024成人网| 日韩欧美中文一区| 99免费精品在线观看| 亚洲综合一二区| 国产精品久久久久久久久免费樱桃 | 国产精品一区二区x88av| 午夜av一区二区| 亚洲成人av一区| 日日夜夜精品视频天天综合网| 国产精品久久久久久久蜜臀| 99riav一区二区三区| 看片的网站亚洲| 老鸭窝一区二区久久精品| 亚洲欧美一区二区视频| 亚洲美女区一区| 一区二区三区欧美久久| 亚州成人在线电影| 青青草伊人久久| 日韩福利视频导航| 国产精品91一区二区| 91在线观看视频| 在线视频欧美区| 日韩精品一区二区三区视频播放| 日韩视频免费观看高清完整版 | 91精品国产一区二区| 欧美日韩视频不卡| 日韩精品资源二区在线| 久久久99久久| 亚洲黄色在线视频| 国产精品天干天干在线综合| 久久亚洲影视婷婷| 中文字幕视频一区| 日韩精品一二三| 欧美在线观看视频在线| 777奇米成人网| 国产欧美日韩亚州综合| 亚洲最新视频在线观看| 日韩中文欧美在线| 激情综合一区二区三区| 9久草视频在线视频精品| 日本福利一区二区| 日韩欧美在线一区二区三区| 亚洲精品乱码久久久久久黑人| 亚洲国产一二三| 免费观看日韩av| 91在线云播放| 欧美变态tickling挠脚心| 又紧又大又爽精品一区二区| 国精产品一区一区三区mba桃花| www.亚洲免费av| 国产精品久久久久四虎| 极品少妇一区二区| 欧美色综合网站| 亚洲视频一区二区在线观看| 激情另类小说区图片区视频区| 91精品在线麻豆| 一区二区高清视频在线观看| 国产精品538一区二区在线| 久久久久久久电影| 成人a级免费电影| www.日韩av| 国产精品久久久久三级| 91婷婷韩国欧美一区二区| 亚洲丝袜精品丝袜在线| 欧美精品在欧美一区二区少妇| 日韩有码一区二区三区| 91国偷自产一区二区三区成为亚洲经典| 欧美激情在线免费观看| 成人黄色免费短视频| 中文字幕乱码久久午夜不卡| 久久伊人中文字幕| 久久久久久一级片| 日韩成人午夜电影| 国产日产欧美精品一区二区三区| 精品一区二区精品| 日韩精品一区二区三区视频| 精品在线视频一区| 亚洲国产经典视频| 日本电影亚洲天堂一区| 一区二区在线观看视频| 欧美一卡2卡三卡4卡5免费| 成人精品gif动图一区| 日本道色综合久久| 精品一区二区三区在线观看 | 亚洲精品亚洲人成人网| 欧美综合天天夜夜久久| 久久精品二区亚洲w码| 国精产品一区一区三区mba桃花 | 国产天堂亚洲国产碰碰| 高清久久久久久| 日本午夜精品视频在线观看| 中文天堂在线一区| 精品久久久久香蕉网| 欧美精品视频www在线观看| 91久久久免费一区二区| 成人精品gif动图一区| 国产精品99久久久| 国产麻豆精品久久一二三| 偷拍亚洲欧洲综合| 亚洲成a人片在线观看中文| 亚洲免费视频成人| 亚洲男女毛片无遮挡| 亚洲免费看黄网站| 亚洲一区二区视频在线| 色综合天天综合网国产成人综合天| 欧美aaa在线| 国产做a爰片久久毛片| 国产精品原创巨作av| 国产成人av福利| 一本一道综合狠狠老| 色久优优欧美色久优优| 99久精品国产| 91国产精品成人| 日韩一区二区在线观看视频| 日韩欧美国产综合一区| 久久夜色精品国产噜噜av| 国产精品视频yy9299一区| 精品国产一区二区三区不卡 | 欧美日韩三级视频| 制服丝袜成人动漫| 国产精品免费久久| 蜜臀av性久久久久蜜臀aⅴ| 91在线观看美女| 精品电影一区二区三区| 日韩一区日韩二区|