PHP - 查找最长的日期“条纹”和“萧条”

时间:2012-10-10 04:44:34

标签: php

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

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

我正试着弄清楚以下内容:

  • 类似于$date_range数组的日期范围,根据是否在该日期发生训练课程,填充为TRUE或FALSE。我很高兴这是一个带有名为date的密钥的关联数组,比方说,session_found(bool)。
  • 最长的'连胜',即训练课程发生的最长连续天数。
  • 最长的'萧条',即培训课程没有发生的最长连续天数。

有人可以指出我正确的方向获取上述信息,而不使用foreach内容$date_range,然后必须使用另一个foreach$valid_dates 1 {} $date_range数组中每个项目的数组?这非常低效......

很抱歉,如果我对所有这些信息过于复杂,那么任何帮助都会非常感激。

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

由于

1 个答案:

答案 0 :(得分: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;
    }
}