0

我目前在 PHP 中有 2 个日期 - 一个“开始”日期和一个“结束”日期。然后,我使用我发现的一个名为createDateRangeArray( $date_range) 的函数创建了一个日期数组。为简单起见,结束日期将始终为今天的日期

我还有一个单独的数组,其中包含一堆日期 ( $valid_dates),这些日期总是介于上述开始日期和结束日期之间。在那些日子里,“某事”发生了——在这种情况下,是一次培训课程。

我正在努力解决以下问题:

  • 类似于$date_range数组的日期范围,根据培训课程是否在该日期发生,填充为 TRUE 或 FALSE。我很高兴这是一个带有名为(bool)的键的关联date数组session_found
  • 最长的“连续”,即培训课程发生的最长连续天数。
  • 最长的“衰退”,即没有发生培训课程的最长连续天数。

有人可以指出正确的方向来获取上述信息,而无需在数组foreach的内容上使用 a $date_range,然后必须foreach$valid_dates数组中的每个项目上使用另一个$date_range数组吗?那效率太低了...

抱歉,如果我对所有这些信息过于复杂,但任何帮助将不胜感激。

我目前在 Debian Wheezy 上使用 PHP 5.4,如果有帮助的话(典型的 LAMP 堆栈)。

谢谢

4

1 回答 1

3

这是完全未经测试的,但是像下面这样的东西怎么样:

你应该得到最长的连续和低迷的结束日期,以及它花了多少天。$sessions 将包含一个以日期为键的数组,true 表示有会话的天数,false 表示没有会话的天数。

仍然是一个 foreach,但我认为你不能避免使用一个。让我知道它是否有效,我真的不知道这段代码的表现如何,但希望能给你一个起点?

$streak = 0;
$slump = 0;
$longeststreak = 0;
$longestslump = 0;
$longeststreakend = 0;
$longestslumpend = 0;

foreach ($date_range as $date) {
    if (in_array($date, $valid_date)) {
        $sessions[$date] = true;
        $streak++;

        // Slump broken, record the length if it beat the previous record
        if ($longestslump < $slump) {
            $longestslump =  $slump;
            $longestslumpend = $date;
        }

        $slump=0;
    }
    else {
        $sessions[$date] = false;
        $slump++;

        // Streak broken, record the length if it beat the previous record
        if ($longeststreak < $streak) {
            $longeststreak =  $streak;
            $longeststreakend = $date;
        }

        $streak=0;
    }
}
于 2012-10-10T05:06:05.813 回答