2

定期的なイベントを入力するためのコードをいくつか書きました。最も厄介な部分は、ユーザーがイベントを作成し、x 週間ごとに選択した曜日に繰り返すことができることです。

たとえば、ユーザーは月、水、金を選択して、3 週間ごとに繰り返すことができます。

毎週なら簡単です-私はこのようなことをすることができます:

$start = new DateTime( '2013-10-01' );
$end = new DateTime( '2014-01-01 23:59:59' );
$interval = new DateInterval('P1D');

$period = new DatePeriod($start, $interval, $end);
foreach ($period as $date) {
    $dayOfWeek = $date->format('l');
    if ($dayOfWeek == 'Monday' || $dayOfWeek == 'Wednesday' || $dayOfWeek == 'Wednesday') {
        // do something
    }
}

上記のコードの場合、3 週間ごとに月/水/金を含めるように変更するにはどうすればよいですか? 毎日ループせずにこれを達成するためのより良い方法はありますか?

$date->format('w'); を使用できると考えています。これにより、その年の数値の週が得られます。その後、カウンターを作成してリセットすることができました。

4

2 に答える 2

4

可能なアプローチとして、foreach 内で週が変わるかどうかを確認できます。

<?php

$start = new DateTime( '2013-10-01' );
$end = new DateTime( '2014-01-01 23:59:59' );
$interval = new DateInterval('P1D');

$period = new DatePeriod($start, $interval, $end);

// only trigger every three weeks...
$weekInterval = 3;

// initialize fake week
$fakeWeek = 0;
$currentWeek = $start->format('W');

foreach ($period as $date) {

    if ($date->format('W') !== $currentWeek) {
        $currentWeek = $date->format('W');
        $fakeWeek++;
        print ' WEEK ' . $currentWeek . '<br/>';
    }

    if ($fakeWeek % $weekInterval !== 0) {
        continue;
    }

    $dayOfWeek = $date->format('l');
    if ($dayOfWeek == 'Monday' || $dayOfWeek == 'Wednesday' || $dayOfWeek == 'Friday') {
        print $date->format('Y-m-d H:i:s') . '   ' . $dayOfWeek . '<br/>';
    }
}
于 2013-10-26T10:36:58.030 に答える
1

それがあなたが探しているものかどうかはわかりませんが、すべての日付を確認するよりははるかに優れています。第一月・水・金がわかる場合

例えば:

<?php
$interval = 3;
$monday = date('Y-m-d',strtotime('next Monday'));
$wednesday = date('Y-m-d',strtotime('next Wednesday'));
$friday = date('Y-m-d',strtotime('next Friday'));

for($i=0; $i<$interval;++$i){   
    echo $monday."\n";
    echo $wednesday."\n";
    echo $friday."\n";
    $monday =  date('Y-m-d', strtotime($monday . ' +1 Week'));
    $wednesday =  date('Y-m-d', strtotime($wednesday . ' +1 Week'));
    $friday =  date('Y-m-d', strtotime($friday . ' +1 Week'));
}                       

?>

これはループで行うことができ、すべての日付を調べる必要はありません。

于 2013-10-26T10:07:47.657 に答える