我有一个函数,我将总共5个参数传递给它。
$Date1, $Time1, $Date2 and $Time2 and $Interval.
我首先使用Date1Time1形成一个timestamp1,然后使用Date2Time2形成一个timestamp2,然后我将这两个时间戳划分为相等的小时间隔,然后存储到一个关联数组中。
e.g。
$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);
}
答案 0 :(得分:0)
遇到的问题是无限循环,这是由条件$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));
您也应该保持一致,此处使用的日期格式与您作为示例提供的格式不一致。
答案 1 :(得分:0)
现在根据您的建议,我对代码和要求进行了一些更改。
我还没决定使用Assoc数组。
相反,我会在相等的时间间隔之间划分两个邮票(假设有可能)。
然后我正在对这个字符串进行简单的数组推送。
稍后,一旦这个数组形成,我将解析它并将日期和时间分开。
现在我的代码没有进入无限循环,因为我正在比较两个时间戳。但现在,问题是它将第一个值推送到数组,但所有后续值都被推送为null
所以我从下面的代码得到的输出就像 阵列[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);
}
答案 2 :(得分:-2)
问题是你的while循环while( $Date1 < $Date2){...}
你永远不会改变$ Date1或$ Date2的值,所以循环继续使用if( $Date1 < $Date2){...}