PHP-查找最长日期“;条纹“;及;“暴跌”;

PHP-查找最长日期“;条纹“;及;“暴跌”;,php,Php,我目前在PHP中有两个日期,一个是“开始”日期,一个是“结束”日期。然后,我使用一个名为($date\u range)的函数创建了一个日期数组。为简单起见,结束日期将始终是今天的日期 我还有一个单独的数组,其中包含一组日期($valid\u dates),这些日期总是介于上述开始日期和结束日期之间。在那些日子里,发生了一些事情——在这个例子中,是一次培训 我正试着了解以下几点: 类似于$date\u range数组的日期范围,根据培训课程是否在该日期进行,用TRUE或FALSE填充。我很高兴这

我目前在PHP中有两个日期,一个是“开始”日期,一个是“结束”日期。然后,我使用一个名为(
$date\u range
)的函数创建了一个日期数组。为简单起见,结束日期将始终是今天的日期

我还有一个单独的数组,其中包含一组日期(
$valid\u dates
),这些日期总是介于上述开始日期和结束日期之间。在那些日子里,发生了一些事情——在这个例子中,是一次培训

我正试着了解以下几点:

  • 类似于
    $date\u range
    数组的日期范围,根据培训课程是否在该日期进行,用TRUE或FALSE填充。我很高兴这是一个assoc数组,其中的键名为
    date
    ,比如说,
    session\u found
    (bool)
  • 最长的“连胜”,即培训课程的最长连续天数
  • 最长的“衰退期”,即没有进行培训课程的最长连续天数
有人能告诉我获取上述信息的正确方向,而不必对
$date\u范围
数组的内容使用
foreach
,然后对
$date\u范围
数组中的每个项目使用另一个
foreach
数组吗?这是非常低效的

对不起,如果我有太复杂的事情与所有的信息,但任何帮助将不胜感激

如果有帮助的话,我目前正在Debian Wheezy上使用PHP5.4(典型的灯堆栈)


谢谢

这是完全未经测试的,但是下面的内容怎么样:

你应该得到最长连胜和暴跌的结束日期,以及它花了多少天$会话将包含一个以日期为键的数组,有会话的天数为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;
    }
}
$streak=0;
美元=0;
$longeststreak=0;
$longestlump=0;
$LongestStrokeEnd=0;
$LONGESTEND=0;
foreach($date\u范围为$date){
if(在数组中($date,$valid_date)){
$sessions[$date]=true;
$streak++;
//坍落度破,如果超过上一个记录,则记录长度
如果($longestlump<$slump){
$longestlump=$slump;
$longestlumpend=$date;
}
美元=0;
}
否则{
$sessions[$date]=false;
美元++;
//条纹断裂,如果超过上一条记录,则记录长度
如果($longeststreak<$streak){
$longeststreak=$streak;
$LongestStrokeEnd=$date;
}
$streak=0;
}
}

这是完全未经测试的,但下面的内容如何:

你应该得到最长连胜和暴跌的结束日期,以及它花了多少天$会话将包含一个以日期为键的数组,有会话的天数为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;
    }
}
$streak=0;
美元=0;
$longeststreak=0;
$longestlump=0;
$LongestStrokeEnd=0;
$LONGESTEND=0;
foreach($date\u范围为$date){
if(在数组中($date,$valid_date)){
$sessions[$date]=true;
$streak++;
//坍落度破,如果超过上一个记录,则记录长度
如果($longestlump<$slump){
$longestlump=$slump;
$longestlumpend=$date;
}
美元=0;
}
否则{
$sessions[$date]=false;
美元++;
//条纹断裂,如果超过上一条记录,则记录长度
如果($longeststreak<$streak){
$longeststreak=$streak;
$LongestStrokeEnd=$date;
}
$streak=0;
}
}