我在一个页面上有多个jquery完整日历,用于我们软件中的机器调度。一旦工作负载的特定输入发生变化,每个日历都会进行一次ajax调用。在我的AJAX脚本中,我需要根据机器已经计划好的时间以及当天是否有足够的工作人员来计算日历中将被禁用的日期。
到目前为止,我得到的是:
$retval = Array();
$objectid = $_REQUEST["objectid"];
$type = $_REQUEST["type"];
$amount = $_REQUEST["amount"];
$date = $_REQUEST["date"];
$month = date("m",strtotime($date));
$year = date("Y",strtotime($date));
if ($month == date("m") && $year == date("Y"))
{
$start = mktime(0,0,0,date("m"),date("d"),date("Y"));
} else {
$mktime1 = mktime(0,0,0,$month,24,$year);
$start = strtotime('-1 month',$mktime1);
}
$mktime2 = mktime(0,0,0,$month,6,$year);
$end = strtotime('+2 month',$mktime2);
$job_arr = Array();
$jobs = PlanningJob::getAllJobs(" AND start>".$start." AND end<".$end);
foreach ($jobs as $job)
{
$date = mktime(0,0,0,date("m",$job->getDate()),date("d",$job->getDate()),date("Y",$job->getDate()));
$job_arr[$date] = 0;
if ($job->getTime()>0)
$job_arr[$date] += $job->getTime();
elseif ($job->getPlannedTime()>0)
$job_arr[$date] += $job->getPlannedTime();
}
if ($type == "ME"){
$me = new Machineentry($objectid);
$machine = $me->getMachine();
for ( $i = $start; $i <= $end; $i = $i + 86400 ) {
$date = mktime(0,0,0,date("m",$i),date("d",$i),date("Y",$i));
$total_seconds = $machine->getRunningtimeForDay($date);
if (isset($job_arr[$date]))
{
$total_seconds -= ($job_arr[$date]*60*60);
}
if ($total_seconds < ($amount*60*60))
$retval[] = date("d.m.Y",$date);
}
} else if ($type == "OP")
{
$op = new Orderposition($objectid);
$jobart = new Article($op->getObjectid());
}
现在,我想知道是否有一种更好的方法可以同时计算这么多日期(日期范围)——性能方面。因为这个非常重,需要几秒钟的时间,这确实减慢了我们的日程安排过程。
如果有任何帮助/建议,我将不胜感激!
诚挚的问候,
Alex
[EDIT]关于我需要输出的更多信息:
一个数组包含:范围内的所有日期
并且在此数组中每个日期:
1.当天有空闲时间的所有用户及具体时间
2.当天在机器上安排的总时间
第二阵列
每个日期:如果机器上没有足够的"空闲"时间,则只显示日期,以便在日历中禁用。
这是我不久前写的一个函数,它将使用两个日期,并返回它们之间的范围数组。我在很多事情上都使用这个功能,而且速度很快。
为$dateFrom和$dateTo提供的日期应为YYYY-MM-DD格式。
function createDateRangeArray($dateFrom,$dateTo)
{
$arrayRange=array();
$dateFrom=mktime(1,0,0,substr($dateFrom,5,2), substr($dateFrom,8,2),substr($dateFrom,0,4));
$dateTo=mktime(1,0,0,substr($dateTo,5,2), substr($dateTo,8,2),substr($dateTo,0,4));
if ($dateTo>=$dateFrom)
{
array_push($arrayRange,date('Y-m-d',$dateFrom));
while ($dateFrom<$dateTo)
{
$dateFrom+=86400;
array_push($arrayRange,date('Y-m-d',$dateFrom));
}
}
return $arrayRange;
}