欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP實現(xiàn)兩種排課方式

 更新時間:2021年06月26日 16:54:41   作者:不如喫茶去  
這篇文章主要介紹了PHP實現(xiàn)兩種排課方式,第一種排課方式比較好理解,開始時間和結束時間,第二種比較復雜一些,有開始上課時間和結束上課時間和第幾周,具體實現(xiàn)代碼參考下本文

兩種排課方式:

固定每周的固定時間上課(例:共上20節(jié),每周六、周日早上8點-10點上課。假如今天周六凌晨1點,那么排課也需要從今天開始)總共上幾個周,每周上課時間比較個性化(例:共上三周,第一周周一周二早上8點-10點上課;第二周周三周四下午8點-10點上課;第三周周日中午11點-12點上課。)

第一種排課比較好實現(xiàn),簡要代碼如下:

/**
     * 生成日期列表
     *
     * @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 課時計劃數(shù)量
     * @param  int $skipHoliday 跳過節(jié)假日
     *
     * @return array
     */
    public function generateDateList($startDate, $timeList, $amount, $skipHoliday = 0)
    {
        // 計算開始日期是周幾
        $startDateWeek = intval(date('N', $startDate));
 
        //規(guī)范化課時數(shù)據(jù) week_at 做key的三維數(shù)組
        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('課時計劃數(shù)據(jù)為空');
            return false;
        }
 
        //設置跳過假期,獲取開始日期之后的節(jié)假日
        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);
                    //對應的日期 = 開始時間 + ((開始時間對應周 <= 數(shù)據(jù)對應的周幾 ? (數(shù)據(jù)對應的周幾 - 開始時間對應周) :(7 - 開始時間對應周 + 數(shù)據(jù)對應的周幾)) * 86400)
                    //假期跳過排課
                    if ($skipHoliday && !empty($holidayData)) {
                        $startUnix = $currentDateTime + $time['start_at'] * 3600;  //開始時間
                        $endUnix = $currentDateTime + $time['end_at'] * 3600;     //結束時間
 
                        $skip = false;
 
                        //選擇跳過節(jié)假日,且節(jié)假日與當前課程時間有重疊跳過
                        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;
    }

(例子,只用來展示數(shù)據(jù)結構)假如總共5節(jié)課時,從6-25日開始排課,每周一、周六上課:

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


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

/**
     * 生成日期列表
     *
     * @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;
            }
 
            //計算每條數(shù)據(jù)對應的日期 $key == 0:確定第一周第一節(jié)課是在本周還是下一周
            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;
 
            //生成課時數(shù)據(jù)
            $list[] = [
                    'date_at' => $task['date_at'],
                    'week_at' => $task['week'],
                    'start_at' => $startAt,
                    'end_at' => $endAt
                ];
        }
 
        return $list;
    }

(例子,只用來展示數(shù)據(jù)結構)排課數(shù)據(jù):

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

到此這篇關于PHP實現(xiàn)兩種排課方式的文章就介紹到這了,更多相關PHP實現(xiàn)排課內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • windows7下安裝php的php-ssh2擴展教程

    windows7下安裝php的php-ssh2擴展教程

    這篇文章主要介紹了windows7下安裝php的php-ssh2擴展教程,本文同時適用XP系統(tǒng),但Win8沒有測試過,需要的朋友可以參考下
    2014-07-07
  • 一文帶你學會使用PHP接口

    一文帶你學會使用PHP接口

    PHP中的Interface是一種非常重要的特性,它允許開發(fā)人員定義一組規(guī)范或者約束,以確保類之間的互操作性和兼容性。在本文中,我們將詳細介紹PHP中的Interface的概念、定義、實現(xiàn)、使用、使用場景以及其它相關的一些知識點,需要的朋友可以參考下
    2023-04-04
  • Linux下PHP連接Oracle數(shù)據(jù)庫

    Linux下PHP連接Oracle數(shù)據(jù)庫

    PHP連接Oracle是通過oci8訪問的。需要在web服務器上安裝oracle-instantcilent,使PHP支持Oracle擴展包OCI。下面我們來一步步詳細介紹下如何使用PHP連接Oracle。
    2014-08-08
  • smarty的section嵌套循環(huán)用法示例

    smarty的section嵌套循環(huán)用法示例

    這篇文章主要介紹了smarty的section嵌套循環(huán)用法,結合簡單實例形式分析了Smarty使用section進行嵌套循環(huán)操作的實現(xiàn)技巧,需要的朋友可以參考下
    2016-05-05
  • 解決laravel5.4下的group by報錯的問題

    解決laravel5.4下的group by報錯的問題

    今天小編就為大家分享一篇解決laravel5.4下的group by報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • 詳解HTTP Cookie狀態(tài)管理機制

    詳解HTTP Cookie狀態(tài)管理機制

    cookie 最早是網(wǎng)景公司的雇員 Lou Montulli 在1993年3月發(fā)明,后被 W3C 采納,目前 cookie 已經(jīng)成為標準,所有的主流瀏覽器如 IE、Chrome、Firefox、Opera 等都支持
    2016-01-01
  • 將php數(shù)組輸出html表格的方法

    將php數(shù)組輸出html表格的方法

    這篇文章主要介紹了將php數(shù)組輸出html表格的方法,需要的朋友可以參考下
    2014-02-02
  • 微信支付開發(fā)教程(一)微信支付URL配置

    微信支付開發(fā)教程(一)微信支付URL配置

    現(xiàn)階段微信火的厲害,所以相應的關于微信的開發(fā)需求也就多了起來,這個系列我們就來談談微信支付的開發(fā),本文是第一篇,微信支付URL配置
    2014-05-05
  • PHP Echo字符串的連接格式

    PHP Echo字符串的連接格式

    這篇文章主要介紹了PHP Echo字符串的連接格式 的相關資料,需要的朋友可以參考下
    2016-03-03
  • ThinkPHP5.1框架頁面跳轉及修改跳轉頁面模版示例

    ThinkPHP5.1框架頁面跳轉及修改跳轉頁面模版示例

    這篇文章主要介紹了ThinkPHP5.1框架頁面跳轉及修改跳轉頁面模版,結合實例形式分析了thinkPHP5.1框架進行頁面跳轉及修改跳轉模板相關操作技巧,需要的朋友可以參考下
    2019-05-05

最新評論