我有一个函数,我将总共5个参数传递给它。
$Date1, $Time1, $Date2 and $Time2 and $Interval.
我首先使用Date1Time1形成时间戳1,然后使用Date2Time2形成时间戳2,然后将这两个时间戳划分为相等的小时间隔,然后存储到关联数组中。
例如
$Date1 = 27-03-2016
$Time1 = 18:00
$Date2 = 27-03-2016
$Time2 = 21:00
现在我想把这个时间分成60分钟的相等时间间隔,然后把它存储到下面格式的关联数组中。
$array=[27-03-2016=>18:00,27-03-2016=>19:00,27-03/2016=>20:00,27-03.2016=>21:00]
我用php编写了以下函数。当我运行这个程序时,文件将永远挂起,没有任何响应,当我检查服务器日志时,它会给出错误:行超过了30秒的最大执行时间
$end_time = date('H-i',strtotime($end_timestamp));
由于我对php还比较陌生,所以我无法理解出了什么问题。
function FindTimeSpan (&$Date1,&$Time1,&$Date2,&$Time2,&$Interval)
{
$timespan=array($Date1 => $Time1);
$timestamp1 = strtotime($Date1 . $Time1);
$timestamp2 = strtotime($Date2 . $Time2);
while( $Date1 < $Date2)
{
$start_timestamp = $timestamp1;
$end_timestamp = $timestamp2 . '+' .$Interval;
//Separating Date and Time from a timestamp
$end_date = date('Y-m-d',strtotime($end_timestamp));
$end_time = date('H-i',strtotime($end_timestamp));
//pushing value to an array
$timespan = array_merge($timespan, array($end_date => $end_time));
//setting the start value to the new end value
$timestamp1 = $end_timestamp;
}
echo 'timestamp array' . json_encode($timespan);
}
您遇到的问题是一个无限循环,它是由条件$Date1 < $Date2
引起的。您不修改这两个值中的任何一个,因此条件将始终为true。奇怪的是,您没有使用修改后的不同timestamp
值,但您应该这样做。
关于这一点,您应该将$end_timestamp = $timestamp2 . '+' .$Interval;
简单地替换为$end_timestamp = $timestamp2 + $Interval ;
。使用单引号和点会使PHP将其视为字符串运算,而不是数学运算。有了这个并使用这个循环条件$timestamp1 < $timestamp2
,您的代码应该停止。
正如在一条评论中所说,你的数组结构是不可能的,因为你不能多次为同一个键赋值。相反,您应该为每个日期创建一个数组,并将不同的时间推送到这些数组中。
要做到这一点,您应该首先修复在循环中检索日期和时间的方式。在下面的代码中,对strtotime
的调用是不必要的,因为函数date
需要时间戳,所以不需要将其转换回字符串。
//Separating Date and Time from a timestamp
$end_date = date('Y-m-d',strtotime($end_timestamp));
$end_time = date('H-i',strtotime($end_timestamp));
你也应该保持一致,这里使用的日期格式与你举的示例格式不一致。
现在,根据您上面的建议,我对代码和需求进行了一些更改。
-
我还没有决定使用Assoc数组。
-
相反,我将在相等的时间间隔之间划分两个邮票(假设这是可能的)。
-
然后我正在做这个字符串的简单数组推送。
-
稍后,一旦这个数组形成,我将解析它,并将Date和Time分开。
现在,当我比较这两个时间戳时,我的代码并没有进入无限循环。但现在的问题是,它将第一个值推送到数组,但所有后续值都被推送为空
所以我从下面的代码中得到的输出如下array[1459051200,null,null,null,……]
以下是代码
$Date1 = "2016-03-27";
$Time1 = "00:00";
$Date2 = "2016-03-30";
$Time2 = "22:00";
$Interval = '60';
FindTimeSpan ($Date1, $Time1, $Date2, $Time2, $Interval);
function FindTimeSpan (&$Date1,&$Time1,&$Date2,&$Time2,&$Interval)
{
$timestamp1 = strtotime($Date1 . $Time1);
$timespan=array();
array_push($timespan,$timestamp1);
echo 'Value of array timespan' . json_encode($timespan);
$timestamp2 = strtotime($Date2 . $Time2);
while( $timestamp1 < $timestamp2)
{
$start_timestamp = $timestamp1;
$end_timestamp = $timestamp1 + $Interval;
//pushing value to an array
array_push($timespan,$end_timespan);
//
$timestamp1 = $end_timestamp;
}
echo 'timestamp array' . json_encode($timespan);
}