可重复的事件PHP

时间:2014-03-31 09:21:38

标签: php loops

我有array()个工作日来重复我的活动。

[days_repeat] => Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
    )
每天星期一,星期三,星期三,事件应该重复1,2,3,但我也是

[start_date] => 2014-04-2
[end_date] => 2014-05-30

你可以看到开始日不是重复的第一天,如果它更容易,只需循环并制作日期和中断循环,当日期大于结束日期时,但也许你可以告诉我一些很好的策略来实现这个目标

天重复数组只能包含工作日数字等等!

5 个答案:

答案 0 :(得分:2)

首先,将start_date转换为时间戳。

然后使用php date()函数:

echo date('w', $your_timestamp);

你可以知道first_date,0(星期日)到6(星期六)的哪一天。

然后只需循环检查它们是否与您的阵列匹配。

答案 1 :(得分:1)

如果您的数据代表一周内的天数(即一周的第一天直到一周的第七天),那么您只需要检查当前显示的日期,如果它的相同“天数”

例如

echo (new DateTime())->format("w");

将打印

1
星期一

查看文档以获取更多信息。 http://www.php.net/manual/en/function.date.php

所以你只需要检查当前的日期是否在你的重复数组中!

答案 2 :(得分:1)

试试这个:

$daysRepeat = array(1,2,3);
$startDate = '2014-04-02';
$endDate = '2014-05-30';

//Convert to timestamps;
$startDateTstamp = strtotime($startDate);
$endDateTstamp = strtotime($endDate);

//Loop through days between start and end date
$tstamp = $startDateTstamp;
while($tstamp < $endDateTstamp) {

    //Calculate numerical representation of week day (1-7)
    $weekDay = date('N', $tstamp);
    if(in_array($weekDay, $daysRepeat)) {
        print date('Y-m-d', $tstamp) . "<br />";
    }
    $tstamp += (60*60*24);
}

输出:

2014-04-02
2014-04-07
2014-04-08
2014-04-09
2014-04-14
2014-04-15
2014-04-16
2014-04-21
2014-04-22
2014-04-23
2014-04-28
2014-04-29
2014-04-30
2014-05-05
2014-05-06
2014-05-07
2014-05-12
2014-05-13
2014-05-14
2014-05-19
2014-05-20
2014-05-21
2014-05-26
2014-05-27
2014-05-28

答案 3 :(得分:1)

您可以使用以下代码实现此目的:

<?php
    $days_repeat = array(
        '1', // Monday
        '2', // Tuesday
        '3', // Wednesday
    );

    // first set timezone
    date_default_timezone_set('UTC');

    // Start date
    $date = '2014-04-02';
    // End date
    $end_date = '2014-05-30';

    while (strtotime($date) <= strtotime($end_date)) {
        // first find out which day of the week it is (0=sunday; 1=monday ... 6=saturday)
        $dateWeekDay = date("w", $date);

        // convert sunday from 0 to 7 if needed
        if ($dateWeekDay == 0) { $dateWeekDay = 7; }

        // check if $days_repeat has current day
        if (in_array($dateWeekDay, $days_repeat)) {
            // do action as this day is in $days_repeat
            echo date("Y-m-d"). ' is in $days_repeat';
        }

        // add +1 day and continue loop
        $date = date("Y-m-d", strtotime("+1 day", strtotime($date)));
    }

?>

答案 4 :(得分:1)

方便地,您根据ISO-8601规范表示星期几。这意味着您可以使用PHP的内置date()功能,而无需对您的格式进行其他翻译。那很好。

接下来,您需要弄清楚如何将start_dateend_date转换为PHP可以理解的日期格式。看起来mktime()是您最好的选择 - 如果您不关心它们,请将时间元素初始化为0。

您现在可以按天迭代,如果date("N", $currentDay)在您想要的日期数组中,请在当天重复该事件(无论需要什么)。在这里,$currentDay是您要检查的循环时间戳。 date("N")返回manual page for date()中指定的相同ISO-8601格式的星期几编号。