




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第PHP實(shí)現(xiàn)兩種排課方式兩種排課方式:
固定每周的固定時(shí)間上課(例:共上20節(jié),每周六、周日早上8點(diǎn)-10點(diǎn)上課。假如今天周六凌晨1點(diǎn),那么排課也需要從今天開始)總共上幾個(gè)周,每周上課時(shí)間比較個(gè)性化(例:共上三周,第一周周一周二早上8點(diǎn)-10點(diǎn)上課;第二周周三周四下午8點(diǎn)-10點(diǎn)上課;第三周周日中午11點(diǎn)-12點(diǎn)上課。)
第一種排課比較好實(shí)現(xiàn),簡要代碼如下:
*生成日期列表
*@paramint$startDate開始日期時(shí)間戳格式
*@paramarray$timeList課時(shí)計(jì)劃列表
"start_at":"09:09",//開課時(shí)間
"end_at":"10:09",//結(jié)束時(shí)間
"week_at":1//周幾
"start_at":"12:09",//開課時(shí)間
"end_at":"13:09",//結(jié)束時(shí)間
"week_at":1//周幾
"start_at":"09:09",
"end_at":"10:09",
"week_at":5
*@paramint$amount課時(shí)計(jì)劃數(shù)量
*@paramint$skipHoliday跳過節(jié)假日
*@returnarray
publicfunctiongenerateDateList($startDate,$timeList,$amount,$skipHoliday=0)
//計(jì)算開始日期是周幾
$startDateWeek=intval(date('N',$startDate));
//規(guī)范化課時(shí)數(shù)據(jù)week_at做key的三維數(shù)組
foreach($timeListas$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ì)劃數(shù)據(jù)為空');
returnfalse;
//設(shè)置跳過假期,獲取開始日期之后的節(jié)假日
if($skipHoliday){
$holiday=newHoliday();
$holidayData=$holiday-getHolidayList($startDate);
$holiday=null;
unset($holiday);
$nowTime=time();
$list=array();
for($weekStartTime=$startDate,$count=0;$count$amount;$weekStartTime+=86400*7){
//$currentWeek:周幾
foreach($weeksTimeas$currentWeek=$weekTime){
foreach($weekTimeas$time){
//算出對應(yīng)的日期時(shí)間戳
$currentDateTime=$weekStartTime+(($startDateWeek=$currentWeek($currentWeek-$startDateWeek):(7-$startDateWeek+$currentWeek))*86400);
//對應(yīng)的日期=開始時(shí)間+((開始時(shí)間對應(yīng)周=數(shù)據(jù)對應(yīng)的周幾?(數(shù)據(jù)對應(yīng)的周幾-開始時(shí)間對應(yīng)周):(7-開始時(shí)間對應(yīng)周+數(shù)據(jù)對應(yīng)的周幾))*86400)
//假期跳過排課
if($skipHoliday!empty($holidayData)){
$startUnix=$currentDateTime+$time['start_at']*3600;//開始時(shí)間
$endUnix=$currentDateTime+$time['end_at']*3600;//結(jié)束時(shí)間
$skip=false;
//選擇跳過節(jié)假日,且節(jié)假日與當(dāng)前課程時(shí)間有重疊跳過
foreach($holidayDataas$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('上課時(shí)間不能小于當(dāng)前時(shí)間');
returnfalse;
$list[]=[
'date_at'=$currentDateTime,//日期
'week_at'=$currentWeek,//周幾
'start_at'=$startAt,
'end_at'=$endAt
$count++;
if($count=$amount){
break3;
$weeksTime=null;
unset($weeksTime);
return$list;
}
(例子,只用來展示數(shù)據(jù)結(jié)構(gòu))假如總共5節(jié)課時(shí),從6-25日開始排課,每周一、周六上課:
(例子,只用來展示數(shù)據(jù)結(jié)構(gòu))排課結(jié)果為:
第二種排課方式稍微麻煩一點(diǎn),簡要代碼如下:
*生成日期列表
*@paramint$startDate開始日期時(shí)間戳格式
*@paramarray$taskList任務(wù)列表
"start_at":"09:09",//開始上課時(shí)間
"end_at":"10:09",//結(jié)束時(shí)間
"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
*@returnarray
publicfunctiongenerateDateList($startDate,$taskList)
//計(jì)算開始日期是周幾
$startDateWeek=intval(date('N',$startDate));
$list=[];
$nowTime=time();
$weekSign=$week=0;
foreach($taskListas$key=$task){
if($task['week_number']$weekSign$task['week_number']!=$week){
$weekSign=$task['week_number']-$week;
//計(jì)算每條數(shù)據(jù)對應(yīng)的日期$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('上課時(shí)間不能小于當(dāng)前時(shí)間');
returnfalse;
$task['start_at']=$s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆沂源縣三上數(shù)學(xué)期末質(zhì)量檢測試題含解析
- 水利水電工程畢業(yè)生就業(yè)方向分析試題及答案
- 規(guī)劃設(shè)計(jì)中正確的生活方式
- 禮儀課程設(shè)計(jì)案例分享
- 公共關(guān)系學(xué)公共政策試題及答案
- 2025年經(jīng)濟(jì)法復(fù)習(xí)及考題情報(bào)
- 隧道堵漏安全培訓(xùn)課件
- 臨床橫紋肌溶解癥發(fā)病機(jī)制治療護(hù)理措施診斷及健康教育急救護(hù)理
- 眼科病人護(hù)理概述
- 人力資源管理:基于創(chuàng)新創(chuàng)業(yè)視角學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2024年國家公務(wù)員考試《行測》真題卷(地市卷)-答案和解析
- 2024年注冊安全工程師真題答案與解析【法規(guī)】
- 個(gè)人換匯合同協(xié)議書范文
- 衛(wèi)生院優(yōu)化服務(wù)環(huán)境提升社會(huì)滿意度整改方案
- 2025年高級衛(wèi)生專業(yè)技術(shù)資格考試傳染性疾病控制(087)(副高級)試卷及答案指導(dǎo)
- 學(xué)習(xí)|新收入準(zhǔn)則(財(cái)政部會(huì)計(jì)司培訓(xùn))
- 網(wǎng)課智慧樹知道《網(wǎng)絡(luò)思想政治教育(湖南師范大學(xué))》章節(jié)測試答案
- 耳穴壓豆治療失眠
- 陜西省八年級初中信息技術(shù)學(xué)業(yè)水平考試(操作題)
- 西方古代建筑史智慧樹知到期末考試答案2024年
評論
0/150
提交評論