Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP日期间隔每x周选择一周中的几天_Php_Datetime_Dateinterval_Recurring Events - Fatal编程技术网

PHP日期间隔每x周选择一周中的几天

PHP日期间隔每x周选择一周中的几天,php,datetime,dateinterval,recurring-events,Php,Datetime,Dateinterval,Recurring Events,我已经编写了一些用于输入重复事件的代码。最棘手的部分是,用户可以创建一个事件,并让它在一周中的某几天(x周)重复 例如,用户可以选择Mon、Wed、Fri,并每3周重复一次 如果每周都这样做很容易-我可以这样做: $start = new DateTime( '2013-10-01' ); $end = new DateTime( '2014-01-01 23:59:59' ); $interval = new DateInterval('P1D'); $period = new DatePe

我已经编写了一些用于输入重复事件的代码。最棘手的部分是,用户可以创建一个事件,并让它在一周中的某几天(x周)重复

例如,用户可以选择Mon、Wed、Fri,并每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周包含一次Mon/Wed/Fri? 有没有更好的方法来实现这一点而不必每天循环


我想我可以使用$date->format('w');这会给我一年中的数字周。然后我可以设置一个计数器并将其重置。

我不知道这是否是您要找的,但最好是查看所有日期。 当你知道第一个周一/周三/周五

例如:

<?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'));
}                       


您可以循环执行此操作,而不必遍历所有日期。

您可以检查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/>';
    }
}

有趣,不是我想象的,而是一个可能的替代解决方案!谢谢你的意见!事实上,我刚刚得出了一个非常类似的解决方案。