(现在修好并正常工作,但如果有人还想重构,请留言)
这是我所拥有的函数的精简版本,它迭代日期范围并为每个函数分配一个唯一的整数...
<击> 使用大型数据集时,在不同的日期范围内多次运行,我收到一个致命错误,为脚本分配了太多内存并且在此循环中死了......
<击> Fatal error: Allowed memory size of 268435456 bytes exhausted
击>
已修复,这是迭代的一个问题,没有考虑潜在的夏令时
所以,我想知道是否有人可以推荐一种更优化的方式来生成这个月份/整数列表......
它必须允许我以任何我喜欢的数字启动Int和
<?php
// updated: 2010.11.04 with Qwerty's recommendations
// for fixing daylight savings time issue
function monthIterate($monthInt, $startDate, $stopDate) {
$epoch = $startMain = strtotime($startDate);
$stopMain = strtotime($stopDate);
while ($epoch <= $stopMain) {
// get the start/stop dates for "this month"
$start = date("Y-m-01", $epoch);
$stop = date("Y-m-t", $epoch);
// uniqueID for the month
$monthKey = "Month#-".str_pad($monthInt, 3, "0", STR_PAD_LEFT);
$months[$monthKey] = compact('start', 'stop');
// move forward in loop, +1 day should get us to the next month
$epoch = strtotime($stop);
$currentMonth = $nextMonth = date('m', $epoch);
while ($currentMonth == $nextMonth) {
$epoch = $epoch + 86400;
$nextMonth = date('m', $epoch);
}
$monthInt++;
}
return $months;
}
?>
答案 0 :(得分:2)
看起来你的功能无限循环,因为节省了一些时间。
echo date('Y-m-d H:i:s', strtotime('2010-10-31') + 60*60*2); // adding 2 hours
echo date('Y-m-d H:i:s', strtotime('2010-10-31') + 60*60*3); // adding 3 hours
两者都会输出2010-10-31 02:00:00
。因此strtotime('2010-10-31') + 86400
实际上是2010-10-31 23:00:00
,但不是第二天。
因此,您应该添加超过86400秒,以确保切换到第二天: - )
答案 1 :(得分:0)
我认为你的数组索引太疯狂了。
即:
[Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-123] => Array
(
[start] => 2011-12-01
[stop] => 2011-12-31
)
我会移动你的“$ monthInt =”月# - “。str_pad($ monthInt,3,”0“,STR_PAD_LEFT);”循环外的线。
<?php
function monthIterate($monthInt, $startDate, $stopDate) {
$monthInt = "Month#-".str_pad($monthInt, 3, "0", STR_PAD_LEFT); <--
$epoch = $startMain = strtotime($startDate);
$stopMain = strtotime($stopDate);
while ($epoch <= $stopMain) {
// get the start/stop dates for "this month"
$start = date("Y-m-01", $epoch);
$stop = date("Y-m-t", $epoch);
// uniqueID for the month
$months[$monthInt] = compact('start', 'stop');
// move forward in loop, +1 day should get us to the next month
$epoch = strtotime($stop) + 86400;
$monthInt++;
}
return $months;
}?>