PHP 는 두 가지 수업 방식 을 실현 한다.
10184 단어 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 가 배 강 내용 을 실현 하 는 것 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.