0

(現在は修正され、正常に動作していますが、まだリファクタリングを希望する人がいる場合は、メモを残してください)

これは、日付範囲を反復処理し、それぞれに一意の整数を割り当てる関数の簡易バージョンです...

大規模なデータセットで作業し、異なる日付範囲でこれを数回実行すると、致命的なエラーが発生し、スクリプトに割り当てられたメモリが多すぎて、このループで停止します...

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; 
}
?>
4

2 に答える 2

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秒以上を追加する必要があります:-)

于 2010-11-04T20:51:55.107 に答える
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 = "Month#-".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; 
}?>
于 2010-11-04T21:10:20.773 に答える