按周循环排班, 员工人数及每日值班人数可自定义.
<?php
class Schedule {
public $dayNumArr; // 每周中各天的值班人数,从周日(索引为0)到周六(索引为6)为一个循环周
public $employeeCount; // 定义员工人数
private $currEmployeeNum = 1; // 当前员工编号
/**
*
* @param unknown $employeeCount
* @param unknown $dayNumArr
* 每周各天所需人数的数组
*/
function __construct($employeeCount, $dayNumArr) {
$this->employeeCount = $employeeCount;
$this->dayNumArr = $dayNumArr;
}
/**
* 获得当天值班的员工名单
* @param unknown $day 星期
*/
function getEmployees($day) {
$result = "";
for($i = 1; $i <= $this->dayNumArr [$day]; $i ++) {
$result = $result . " ; " . $this->getAEmloyee ();
}
return $result;
}
/**
* 从员工队列里\数据库中取出一个
* @return string
*/
function getAEmloyee() {
if ($this->currEmployeeNum > $this->employeeCount) {
$this->currEmployeeNum = 1;
}
$result = "员工" . $this->currEmployeeNum;
$this->currEmployeeNum ++;
return $result;
}
/**
* 生成某月值班表
* @param unknown $month
* @param number $year
* @return string
*/
function monthChange($month, $year = 2014) {
// 某月的天数
$days = cal_days_in_month ( CAL_GREGORIAN, $month, $year );
// 一周中的一天,初始化为当月第一天的星期起始数
$aWeekDay = intval ( date ( "w", strtotime ( date ( "Y-n-1" ) ) ) );
$schedule = "";
for($i = 1; $i <= $days; $i ++) {
if ($aWeekDay == 6) {
$aWeekDay = 0;
} else {
$aWeekDay ++;
}
$employee = $this->getEmployees ( $aWeekDay );
$str = sprintf("%d-%s-%d(星期%s),值班员工:%s", $year, $month, $i, $this->weekFormat ($aWeekDay), $employee);
$schedule = $schedule . "\n" . $str;
}
return $schedule;
}
/**
* 把0-6装换为星期的日-六
* @param unknown $index
* @return string
*/
function weekFormat($index) {
switch ($index) {
case 0 :
$xingqi = "日";
break;
case 1 :
$xingqi = "一";
break;
case 2 :
$xingqi = "二";
break;
case 3 :
$xingqi = "三";
break;
case 4 :
$xingqi = "四";
break;
case 5 :
$xingqi = "五";
break;
case 6 :
$xingqi = "六";
break;
default :
echo "获取不到星期,有错误!";
}
return $xingqi;
}
}
运行实例:
$weekArr = array (
0 => 0,
1 => 1,
2 => 1,
3 => 1,
4 => 1,
5 => 1,
6 => 2
);
$employeeCount = 13;
$currEmployee = 1; // 从第1个员工开始
$s = new Schedule ( 13, $weekArr );
echo $s->monthChange ( 11, 2014 );
排班结果:
2014-11-1(星期日),值班员工:
2014-11-2(星期一),值班员工: ; 员工1
2014-11-3(星期二),值班员工: ; 员工2
2014-11-4(星期三),值班员工: ; 员工3
2014-11-5(星期四),值班员工: ; 员工4
2014-11-6(星期五),值班员工: ; 员工5
2014-11-7(星期六),值班员工: ; 员工6 ; 员工7
2014-11-8(星期日),值班员工:
2014-11-9(星期一),值班员工: ; 员工8
。。。