我正在为健身房制作这个软件,这个健身房的时间表重叠,如果课程结束时间和课程开始时间之间的时间超过35分钟,则该时间会被删除。
示例:我的工作时间为上午8:00至上午9:00,上午8:30至上午9:30,上午10:10至上午11:10。任何超过35分钟的差距都被认为是一个不同的转变。
我现在只针对每位员工处理薪酬报告。
问题是,他们希望在假期大规模登记每个人,我的大脑有点疯狂,试图找出如何对个别员工ID进行数组和循环,找出重叠,删除> 35分钟并将该班次插入check_ins表。
此时我已经隔离了给定假期的工作人员并按计划进行了调整,我在数组中有员工ID的总数以及数组中的总计划数。
任何人都知道如果不让我自己愚蠢,这怎么可能最容易实现? (如果健身房曾要求你编写调度软件,请运行!)
谢谢!
编辑:假日支付条件和friggin wind一样可变,所以没有帮助。
我的单个员工代码:
//init our arrays
$timeStart = array();
$timeEnd = array();
$x = 0;
$maxInterval = new DateTime('00:35');
$classIDArray = array();
do {
//Get our start times for Monday
$p = new DateTime($row_GetMonSchedule2['Start_time']);
$q = new DateTime($row_GetMonSchedule2['End_time']);
$timeStart[$x] = $p->format('H:i');
$timeEnd[$x] = $q->format('H:i');
//Get Class IDs
$classIDArray[$x] = $row_GetMonSchedule2['Class_ID'];
$totalEndTimes = count($timeEnd);
$x++;
} while ($row_GetMonSchedule2 = mysql_fetch_assoc($GetMonSchedule2));
//echo $totalRows_GetMonSchedule2;
//Now let's check the durations and make our shifts
//echo "Class ID Array: "; print_r($classIDArray);
$x = 0;
$s = 1;
do {
///First Time Start
if ($x == 0) {
$TimeDayStart = $timeStart[$x];
}
if ($x < $totalEndTimes) {
///Last Time End
$TimeDayEnd = $timeEnd[$x];
}
$x++; $s++;
} while ($x < $totalEndTimes);
$x = 0;
$s = 1;
/////Get Durations
$interval = array();
do {
if ($x == 0) {
//The very first end time
//First end time of the first time block
$firstEndTime = new DateTime($timeEnd[$x]);
$startTime = new DateTime($timeStart[$s]);
$timeDiff = $startTime->diff($firstEndTime);
$interval[$x] = $timeDiff->format('%H:%i');
} else {
//We don't need the last record because there isn't anything to calculate it aginst, so increase $x by one
if ($x + 1 > $totalEndTimes) {
} else {
$endTime = new DateTime($timeEnd[$x]);
$startTime = new DateTime($timeStart[$s]);
$timeDiff = $endTime->diff($startTime);
$interval[$x] = $timeDiff->format('%H:%i');
}
}
$x++; $s++;
} while ($x < $totalEndTimes);
//Let's try to break this up into shifts now...
$x =0;
$y =0;
$zz = 1;
$s = 1;
$timeBreak =0;
$durCount = count($interval) - 1;
$BreakStartTimes = array();
$BreakEndTimes = array();
$xx3 = 0;
$yy3 = 0;
//Setup table
do {
if ($x == 0) {
//echo $timeStart[$x]." - ";
$BreakStartTimes[$yy3] = $timeStart[$x];
$yy3++;
if (new DateTime($interval[$x]) > new DateTime('00:35')) {
//echo $timeEnd[$x]." ";
$BreakEndTimes[$xx3] = $timeEnd[$x];
$xx3++;
$timeBreak = 1;
//echo "Time Break";
}
}
if (new DateTime($interval[$x]) > new DateTime('00:35') && $timeBreak != 1) {
//echo $timeEnd[$x]." ";
$BreakEndTimes[$xx3] = $timeEnd[$x];
$xx3++;
$timeBreak = 1;
//echo "Time Break";
}
if ($timeBreak == 1 && $x + 1 < $totalEndTimes) {
//echo $timeStart[$s]." - ";
$BreakStartTimes[$yy3] = $timeStart[$s];
$yy3++;
$timeBreak = 0;
}
$x++; $s++;
} while ($x < $totalEndTimes);
if (empty($BreakEndTimes)) {
//echo "empty";
$ttt = count($timeEnd) - 1;
//echo $ttt;
}
答案 0 :(得分:0)
就像一些评论者在我之前所说的那样,嵌套一些循环应该可以解决问题。尝试用伪代码写下来并从那里填写详细信息。
示例:
//connect to database
$conn = new mysqli("host","user","pass","db");
// check for connection error
if ($mysqli->connect_error)
{
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
//query for all employees working the holiday
// I might be way off with the query seeing as I don't know the complexity
$sql = "SELECT e.ID, count(s.Start_Time) FROM employee e, schedule s
WHERE count(s.Start_Time) >= 1 AND e.ID = s.Employee_ID
AND s.Start_Time >= '2013-12-24 00:00:00.0000'
AND s.End_Time <= '2014-01-02 00:00:00.0000'
GROUP BY e.ID;";
//get the result from database like you do already
//then do the loop
for each employee
{
execute the code you have for the current employee
}
do clean up or other tasks after the loop is done
现在这很容易开始扩展,希望能够提出一个可以构建的想法。