user743873
user743873

Reputation:

PHP - Find longest date "streak" and "slump"

I've currently got 2 dates in PHP - a 'start' date and an 'end' date. I have then created an array of dates, using a function I found called createDateRangeArray ($date_range). For simplicity, the end date will always be today's date.

I've also got a separate array that contains a bunch of dates ($valid_dates) that will always fall between the start and end dates mentioned above. On those dates, 'something' happened - in this case, a training session.

I'm trying to get my head around getting the following:

Can someone point me in the right direction for getting the above info without using a foreach on the contents of the $date_range array and then having to use another foreach for the $valid_dates array on each item in the $date_range array? That is horribly inefficient ...

Sorry if I've over-complicated things with all that info but any help would be much appreciated.

I'm currently using PHP 5.4 on Debian Wheezy, if that helps (typical LAMP stack).

Thanks

Upvotes: 0

Views: 557

Answers (1)

Stoo
Stoo

Reputation: 36

This is completely untested, but how about something like the following:

You should get the end date of the longest streak and slump, as well as how many days it took. $sessions will contain an array with the dates as the keys, and true for days with sessions, and false for days without.

Still a foreach, but I dont think you can avoid using one. Let me know if it works, I really dont have any idea how well this code will behave, but hopefully will give you a starting point?

$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;
    }
}

Upvotes: 2

Related Questions