Reputation:
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:
$date_range
array, populated with TRUE or FALSE based on whether or not a training session happened on that date. I'm happy for this to be an assoc array with keys named date
and, say, session_found
(bool).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
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