Get Range of dates from an array - php

I'm having the following array of dates :
Array
(
[0] => 2016-02-01
[1] => 2016-02-02
[2] => 2016-02-03
[3] => 2016-02-04
[4] => 2016-02-05
[5] => 2016-02-06
[6] => 2016-02-07
[7] => 2016-02-08
[8] => 2016-02-09
[9] => 2016-02-13
[10] => 2016-02-14
[11] => 2016-02-15
[12] => 2016-03-13
[13] => 2016-03-14
[14] => 2016-03-15
[15] => 2016-03-16
[16] => 2016-03-17
[17] => 2016-03-18
[18] => 2016-03-19
[19] => 2016-04-19
[20] => 2016-04-20
[21] => 2016-04-21
[22] => 2016-04-22
)
How can i get the array dates that form a range. Like
Array
(
[0] => 2016-02-01
[1] => 2016-02-02
[2] => 2016-02-03
[3] => 2016-02-04
[4] => 2016-02-05
[5] => 2016-02-06
[6] => 2016-02-07
[7] => 2016-02-08
[8] => 2016-02-09
)
Array
(
[0] => 2016-02-13
[1] => 2016-02-14
[2] => 2016-02-15
)
Array
(
[0] => 2016-03-13
[1] => 2016-03-14
[2] => 2016-03-15
[3] => 2016-03-16
[4] => 2016-03-17
[5] => 2016-03-18
[6] => 2016-03-19
)
The dates in the main array I listed can be of any order. The example I provided all the date ranges can be identifiable. But the raay is dynamic and can have date in random order. All I want to have date ranges out if that array. I'm getting mad of thinking. Please help. Thanks in advance.

You have the following code. Please try this.
$array = Array(0 => '2016-02-01',
1 => '2016-02-02',
2 => '2016-03-19',
3 => '2016-02-04',
4 => '2016-02-05',
5 => '2016-03-18',
6 => '2016-02-07',
7 => '2016-02-08',
8 => '2016-02-09',
9 => '2016-02-13',
10 => '2016-02-14',
11 => '2016-02-15',
12 => '2016-03-13',
13 => '2016-03-14',
14 => '2016-03-15',
15 => '2016-03-16',
16 => '2016-03-17',
17 => '2016-02-06',
18 => '2016-02-03',
19 => '2016-04-19',
20 => '2016-04-20',
21 => '2016-04-21',
22 => '2016-04-22');
//echo "<pre>";print_r($array);
sort($array);
$newDateArray = array();
$i = 0;
$arrayCount = count($array);
foreach($array as $key=>$val) {
//echo $key;
if(isset($array[$key+1])) {
$date1 = $val;
$date2 = $array[$key+1];
$newDateArray[$i][] = $date1;
$datetime1 = date_create($date1);
$datetime2 = date_create($date2);
$interval = date_diff($datetime1, $datetime2);
if($interval->days > 1) {
$i++;
}
}
else if($arrayCount == ($key+1)) {
$newDateArray[$i][] = $date2;
}
}
echo "<pre>";print_r($newDateArray);exit;
your result would be as follows.
Array
(
[0] => Array
(
[0] => 2016-02-01
[1] => 2016-02-02
[2] => 2016-02-03
[3] => 2016-02-04
[4] => 2016-02-05
[5] => 2016-02-06
[6] => 2016-02-07
[7] => 2016-02-08
[8] => 2016-02-09
)
[1] => Array
(
[0] => 2016-02-13
[1] => 2016-02-14
[2] => 2016-02-15
)
[2] => Array
(
[0] => 2016-03-13
[1] => 2016-03-14
[2] => 2016-03-15
[3] => 2016-03-16
[4] => 2016-03-17
[5] => 2016-03-18
[6] => 2016-03-19
)
[3] => Array
(
[0] => 2016-04-19
[1] => 2016-04-20
[2] => 2016-04-21
[3] => 2016-04-22
)
)
Now you can easily split your array. and get the result what you exactly want.
Have a Great Day!!!... Fill free to ask more your doubts...

Related

Grouping consecutive dates in an array together in PHP ignoring weekends and bank holidays

I have an array of dates
$dates = array("2019-04-09","2019-04-17","2019-04-18","2019-04-23","2019-04-24","2019-04-26","2019-04-29","2019-04-30");
what i would like is to pass the $date array through a function and that function would group consecutive working days together to produce the following format.
$newarray = array(
[0]=>array('start' => '2019-04-09','end' => '2019-04-09'),
[1]=>array('start' => '2019-04-17','end' => '2019-04-24'),
[2]=>array('start' => '2019-04-26','end' => '2019-04-30'),
);
Working days are non weekend and non uk bank holidays. I have bank holidays already in another array)
$bankholidays = array(
[0] => 2018-01-01
[1] => 2018-03-30
[2] => 2018-04-02
[3] => 2018-05-07
[4] => 2018-05-28
[5] => 2018-08-27
[6] => 2018-12-25
[7] => 2018-12-26
[8] => 2019-01-01
[9] => 2019-04-19
[10] => 2019-04-22
[11] => 2019-05-06
[12] => 2019-05-27
[13] => 2019-08-26
[14] => 2019-12-25
[15] => 2019-12-26
[16] => 2020-01-01
[17] => 2020-04-10
[18] => 2020-04-13
[19] => 2020-05-04
[20] => 2020-05-25
[21] => 2020-08-31
[22] => 2020-12-25
[23] => 2020-12-28
)
the following function gives me date ranges in the format i require but doesn't take into consideration weekends and bank holidays
function genarray($dates) {
$i=0;
$j=1;
$diff=86400;
$period = $diff;
$nrInterval=0;
$intervals[$nrInterval]['start'] = $dates[$i];
$intervals[$nrInterval]['end'] = $dates[$i];
while($j<count($dates)){
if(strtotime($dates[$j])-strtotime($dates[$i]) == $period){
$intervals[$nrInterval]['end'] = $dates[$j];
$j++;
$period+=$diff;
} else{
$i=$j;
$j++;
$nrInterval++;
$intervals[$nrInterval]['start'] = $dates[$i];
$intervals[$nrInterval]['end'] = $dates[$i];
$period = $diff;
}
}
return $intervals;
}
$dates = array("2019-04-09","2019-04-17","2019-04-18","2019-04-19","2019-04-23","2019-04-24","2019-04-26","2019-04-29","2019-04-30");
$tmp = genarray($dates);
print_r($tmp);
gives me
Array
(
[0] => Array
(
[start] => 2019-04-09
[end] => 2019-04-09
)
[1] => Array
(
[start] => 2019-04-17
[end] => 2019-04-19
)
[2] => Array
(
[start] => 2019-04-23
[end] => 2019-04-24
)
[3] => Array
(
[start] => 2019-04-26
[end] => 2019-04-26
)
[4] => Array
(
[start] => 2019-04-29
[end] => 2019-04-30
)
)
Can anyone help please? I just cant get my head around where to go from here.

How to convert last desired days to weeks in PHP

Hi i have a function who returns me the last 30 days from current day excluding current date. Function is below
function getLastNDays($days, $format = 'd-m-Y'){
$m = date("m"); $de = date("d")-1; $y= date("Y");
$dateArray = array();
for($i=0; $i<=$days-1; $i++){
$dateArray[] = date($format, mktime(0,0,0,$m,($de-$i),$y));
}
$dateArray[] = 'x';
return array_reverse($dateArray);
}
so i am using this function
$sevenarr = getLastNDays(30);
and it is returning me this result
Array
(
[0] => x
[1] => 19-06-2018
[2] => 20-06-2018
[3] => 21-06-2018
[4] => 22-06-2018
[5] => 23-06-2018
[6] => 24-06-2018
[7] => 25-06-2018
[8] => 26-06-2018
[9] => 27-06-2018
[10] => 28-06-2018
[11] => 29-06-2018
[12] => 30-06-2018
[13] => 01-07-2018
[14] => 02-07-2018
[15] => 03-07-2018
[16] => 04-07-2018
[17] => 05-07-2018
[18] => 06-07-2018
[19] => 07-07-2018
[20] => 08-07-2018
[21] => 09-07-2018
[22] => 10-07-2018
[23] => 11-07-2018
[24] => 12-07-2018
[25] => 13-07-2018
[26] => 14-07-2018
[27] => 15-07-2018
[28] => 16-07-2018
[29] => 17-07-2018
[30] => 18-07-2018
)
So what i want now is to show the result days as weeks. so till now i am not able to figure it out how to do this with the upper function. please help me with some logic how can i update my function so i get the weeks of last desired days. For example there is last 30 days it will convert days into weeks
Output i want is
Array
(
[0] => Array
(
['start-date'] => 18-07-2018
['end-date'] => 12-07-2018
)
[1] => Array
(
['start-date'] => 11-07-2018
['end-date'] => 5-07-2018
)
[2] => Array
(
['start-date'] => 04-07-2018
['end-date'] => 28-06-2018
)
[3] => Array
(
['start-date'] => 27-06-2018
['end-date'] => 21-06-2018
)
[4] => Array
(
['start-date'] => 20-06-2018
['end-date'] => 19-06-2018
)
desired output
[weekArray] => Array
(
[1] => Array
(
[0] => 2018-06-19
[1] => 2018-06-20
[2] => 2018-06-21
[3] => 2018-06-22
[4] => 2018-06-23
[5] => 2018-06-24
[6] => 2018-06-25
)
[2] => Array
(
[0] => 2018-06-26
[1] => 2018-06-27
[2] => 2018-06-28
[3] => 2018-06-29
[4] => 2018-06-30
[5] => 2018-07-01
[6] => 2018-07-02
)
[3] => Array
(
[0] => 2018-07-03
[1] => 2018-07-04
[2] => 2018-07-05
[3] => 2018-07-06
[4] => 2018-07-07
[5] => 2018-07-08
[6] => 2018-07-09
)
[4] => Array
(
[0] => 2018-07-10
[1] => 2018-07-11
[2] => 2018-07-12
[3] => 2018-07-13
[4] => 2018-07-14
[5] => 2018-07-15
[6] => 2018-07-16
)
[5] => Array
(
[0] => 2018-07-17
[1] => 2018-07-18
[2] => 2018-07-19
)
)
Check below function to get the days range into weeks. I have considered Sunday as first day of week.
<?php
function getLastNDays($days, $format = 'Y-m-d'){
$retunData = array();
$m = date("m"); $de = date("d")-1; $y= date("Y");
$dateArray = array();
for($i=0; $i<=$days-1; $i++){
$dateArray[] = date($format, mktime(0,0,0,$m,($de-$i),$y));
}
//$dateArray[] = 'x';
$resultArray = array_reverse($dateArray);
// After get the date Range find out Statrt & End date
$start_date = $resultArray[0];
$end_date = $resultArray[count($resultArray)-1];
$from_date = new DateTime($start_date);
$to_date = new DateTime($end_date);
$interval = new DateInterval('P1D');
$dateRange = new DatePeriod($from_date, $interval, $to_date);
$week_number = 1;
$weekArray = array();
foreach ($dateRange as $key => $date) {
$weekArray[$week_number][] = $date->format('Y-m-d');
$mod = $key%7;
if($mod == 6){
$week_number++;
}
/*
if ($date->format('w') == 6) {
$week_number++;
}
*/
}
$retunData['weekArray'] = $weekArray;
//Get the Start & End Date each week.
$weekrange = array_map(function($w) {
return 'start: ' . array_shift($w)
. ', end: ' . array_pop($w); },
$weekArray);
$retunData['weekRange'] = $weekrange;
return $retunData;
}
$retunData = getLastNDays(30); // Call your custom function.
echo '<pre>';
print_r($retunData);
exit;
?>
Your Output will be as per the date range.
Array
(
[weekArray] => Array
(
[1] => Array
(
[0] => 2018-06-20
[1] => 2018-06-21
[2] => 2018-06-22
[3] => 2018-06-23
[4] => 2018-06-24
[5] => 2018-06-25
[6] => 2018-06-26
)
[2] => Array
(
[0] => 2018-06-27
[1] => 2018-06-28
[2] => 2018-06-29
[3] => 2018-06-30
[4] => 2018-07-01
[5] => 2018-07-02
[6] => 2018-07-03
)
[3] => Array
(
[0] => 2018-07-04
[1] => 2018-07-05
[2] => 2018-07-06
[3] => 2018-07-07
[4] => 2018-07-08
[5] => 2018-07-09
[6] => 2018-07-10
)
[4] => Array
(
[0] => 2018-07-11
[1] => 2018-07-12
[2] => 2018-07-13
[3] => 2018-07-14
[4] => 2018-07-15
[5] => 2018-07-16
[6] => 2018-07-17
)
[5] => Array
(
[0] => 2018-07-18
)
)
[weekRange] => Array
(
[1] => start: 2018-06-20, end: 2018-06-26
[2] => start: 2018-06-27, end: 2018-07-03
[3] => start: 2018-07-04, end: 2018-07-10
[4] => start: 2018-07-11, end: 2018-07-17
[5] => start: 2018-07-18, end:
)
)

2 arrays, need the result to be what i show

This is my arrays, i want this result below, but cant figure it out.
The result is a count of how many times an ID have a date between 2014-06-01 to the last day of month 2014-06-xx
In my array with dates "array[1]", only 6-7-8 have wrong dates.
Help please :-S
RESULT
Array
(
[0] => Array
(
[1] => 2
[4] => 2
[7] => 3
[9] => 1
[12] => 1
[13] => 1
)
)
Array
(
[0] => Array
(
[0] => 4
[1] => 4
[2] => 7
[3] => 1
[4] => 7
[5] => 7
[6] => 3
[7] => 3
[8] => 4
[9] => 9
[10] => 12
[11] => 2
[12] => 13
[13] => 1
)
[1] => Array
(
[0] => 2014-06-18
[1] => 2014-06-10
[2] => 2014-06-05
[3] => 2014-06-05
[4] => 2014-06-12
[5] => 2014-06-11
[6] => 2013-12-12
[7] => 2014-07-23
[8] => 2014-05-13
[9] => 2014-06-01
[10] => 2014-06-12
[11] => 2014-06-04
[12] => 2014-06-04
[13] => 2014-06-11
)
)
Hope the following works. Did not test it.
$idsArray = $yourArray[0];
$dateArray = $yourArray[1];
$countArray = array(); // the result array
$beginningTimestamp = strtotime('2014-06-01');
$lastTimestamp = strtotime('2014-07-01'); // before the first of July comes the last of June
foreach ($idsArray as $key => $id) {
if (isset($dateArray[$key])) {
$timestamp = strtotime($dateArray[$key];
if ($timestamp >= $beginningTimestamp && $timestamp < $lastTimestamp) {
if (isset($countArray[$id])) {
$countArray[$id]++;
} else {
$countArray[$id] = 1;
}
}
}
}

php calendar and multidimensional arrays

I have an array of calendar dates, and an multidimensional array of reports where the key to the reports is the date
Array of calendar dates structure
Array
(
[1] => 2014-05-01
[2] => 2014-05-02
[3] => 2014-05-03
[4] => 2014-05-04
[5] => 2014-05-05
[6] => 2014-05-06
[7] => 2014-05-07
[8] => 2014-05-08
[9] => 2014-05-09
[10] => 2014-05-10
[11] => 2014-05-11
[12] => 2014-05-12
[13] => 2014-05-13
[14] => 2014-05-14
[15] => 2014-05-15
[16] => 2014-05-16
[17] => 2014-05-17
[18] => 2014-05-18
[19] => 2014-05-19
[20] => 2014-05-20
[21] => 2014-05-21
[22] => 2014-05-22
[23] => 2014-05-23
[24] => 2014-05-24
[25] => 2014-05-25
[26] => 2014-05-26
[27] => 2014-05-27
[28] => 2014-05-28
[29] => 2014-05-29
[30] => 2014-05-30
[31] => 2014-05-31
)
And my Array of reports structure
Array
(
[2014-05-01] => Array
(
[0] => 16
[1] => 17
[2] => 18
[3] => 20
[4] => 21
[5] => 22
[6] => 15
[7] => 14
[8] => 13
[9] => 1
[10] => 3
[11] => 4
[12] => 5
[13] => 12
)
[2014-05-03] => Array
(
[0] => 5
[1] => 4
[2] => 3
[3] => 1
[4] => 40
)
[2014-05-11] => Array
(
[0] => 2
[1] => 5
[2] => 4
[3] => 3
[4] => 7
[5] => 8
[6] => 9
[7] => 10
[8] => 6
[9] => 1
)
[2014-05-17] => Array
(
[0] => 3
[1] => 10
[2] => 9
[3] => 8
[4] => 7
[5] => 6
[6] => 2
[7] => 5
[8] => 4
[9] => 1
)
[2014-05-18] => Array
(
[0] => 4
[1] => 5
[2] => 3
[3] => 1
)
[2014-05-19] => Array
(
[0] => 5
[1] => 4
[2] => 3
[3] => 1
)
[2014-05-20] => Array
(
[0] => 1
[1] => 9
[2] => 8
[3] => 7
[4] => 6
[5] => 2
[6] => 5
[7] => 4
[8] => 3
[9] => 10
)
[2014-05-26] => Array
(
[0] => 1
[1] => 3
[2] => 4
[3] => 5
)
[2014-05-27] => Array
(
[0] => 10
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 9
[6] => 1
[7] => 6
[8] => 8
[9] => 7
)
)
Now i want to loop through the calendar and for every value in the calendar array (the date) that matches the key of the report array (eg the date), i want to attach the reports to calendar value and use the value calendar as a key to the reports other wise i want to add a string saying no reports done.
heres how i though i might go about
foreach ($calendar as $cal)
{
foreach ($report as $key => $rdate)
{
if ($key == $cal)
{
$calendar[][$cal] = $rdate;
}
}
}
this however just adds them to the end of the calendar array and not where the calendar value and report key match.
Like so
Array
(
[1] => 2014-05-01
[2] => 2014-05-02
[3] => 2014-05-03
[4] => 2014-05-04
[5] => 2014-05-05
[6] => 2014-05-06
[7] => 2014-05-07
[8] => 2014-05-08
[9] => 2014-05-09
[10] => 2014-05-10
[11] => 2014-05-11
[12] => 2014-05-12
[13] => 2014-05-13
[14] => 2014-05-14
[15] => 2014-05-15
[16] => 2014-05-16
[17] => 2014-05-17
[18] => 2014-05-18
[19] => 2014-05-19
[20] => 2014-05-20
[21] => 2014-05-21
[22] => 2014-05-22
[23] => 2014-05-23
[24] => 2014-05-24
[25] => 2014-05-25
[26] => 2014-05-26
[27] => 2014-05-27
[28] => 2014-05-28
[29] => 2014-05-29
[30] => 2014-05-30
[31] => 2014-05-31
[32] => Array
(
[2014-05-01] => Array
(
[0] => 16
[1] => 17
[2] => 18
[3] => 20
[4] => 21
[5] => 22
[6] => 15
[7] => 14
[8] => 13
[9] => 1
[10] => 3
[11] => 4
[12] => 5
[13] => 12
)
)
[33] => Array
(
[2014-05-03] => Array
(
[0] => 5
[1] => 4
[2] => 3
[3] => 1
[4] => 40
)
)
[34] => Array
(
[2014-05-11] => Array
(
[0] => 2
[1] => 5
[2] => 4
[3] => 3
[4] => 7
[5] => 8
[6] => 9
[7] => 10
[8] => 6
[9] => 1
)
)
[35] => Array
(
[2014-05-17] => Array
(
[0] => 3
[1] => 10
[2] => 9
[3] => 8
[4] => 7
[5] => 6
[6] => 2
[7] => 5
[8] => 4
[9] => 1
)
)
[36] => Array
(
[2014-05-18] => Array
(
[0] => 4
[1] => 5
[2] => 3
[3] => 1
)
)
[37] => Array
(
[2014-05-19] => Array
(
[0] => 5
[1] => 4
[2] => 3
[3] => 1
)
)
[38] => Array
(
[2014-05-20] => Array
(
[0] => 1
[1] => 9
[2] => 8
[3] => 7
[4] => 6
[5] => 2
[6] => 5
[7] => 4
[8] => 3
[9] => 10
)
)
[39] => Array
(
[2014-05-26] => Array
(
[0] => 1
[1] => 3
[2] => 4
[3] => 5
)
)
[40] => Array
(
[2014-05-27] => Array
(
[0] => 10
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 9
[6] => 1
[7] => 6
[8] => 8
[9] => 7
)
)
)
instead of this i would like this
Array (
[1] => 2014-05-01 => Array
(
[0] => 16
[1] => 17
[2] => 18
[3] => 20
...........
)
I think where i have been bashing my head against a wall i cant see the woods from the trees.
Any help would be grand or guidence would be grand.
regards Mike
So by writing this out i must of figured it out so it actually helped me just by forming the question, this is what i changed
foreach ($dates_month_with_reports as $cal)
{
foreach ($reportdates as $key => $rdate)
{
if ($key == $cal)
{
//took away the extra array
$dates_month_with_reports[$cal] = $rdate;
}
}
}
and in the calendar array i added the date to the key aswell which now gives me this
Array
(
[2014-05-01] => Array
(
[0] => 16
[1] => 17
[2] => 18
[3] => 20
[4] => 21
[5] => 22
[6] => 15
[7] => 14
[8] => 13
[9] => 1
[10] => 3
[11] => 4
[12] => 5
[13] => 12
)
[2014-05-02] => 2014-05-02
[2014-05-03] => Array
(
[0] => 5
[1] => 4
[2] => 3
[3] => 1
[4] => 40
)
[2014-05-04] => 2014-05-04
[2014-05-05] => 2014-05-05
[2014-05-06] => 2014-05-06
[2014-05-07] => 2014-05-07
[2014-05-08] => 2014-05-08
[2014-05-09] => 2014-05-09
[2014-05-10] => 2014-05-10
[2014-05-11] => Array
(
[0] => 2
[1] => 5
[2] => 4
[3] => 3
[4] => 7
[5] => 8
[6] => 9
[7] => 10
[8] => 6
[9] => 1
)
[2014-05-12] => 2014-05-12
[2014-05-13] => 2014-05-13
[2014-05-14] => 2014-05-14
[2014-05-15] => 2014-05-15
[2014-05-16] => 2014-05-16
[2014-05-17] => Array
(
[0] => 3
[1] => 10
[2] => 9
[3] => 8
[4] => 7
[5] => 6
[6] => 2
[7] => 5
[8] => 4
[9] => 1
)
[2014-05-18] => Array
(
[0] => 4
[1] => 5
[2] => 3
[3] => 1
)
[2014-05-19] => Array
(
[0] => 5
[1] => 4
[2] => 3
[3] => 1
)
[2014-05-20] => Array
(
[0] => 1
[1] => 9
[2] => 8
[3] => 7
[4] => 6
[5] => 2
[6] => 5
[7] => 4
[8] => 3
[9] => 10
)
[2014-05-21] => 2014-05-21
[2014-05-22] => 2014-05-22
[2014-05-23] => 2014-05-23
[2014-05-24] => 2014-05-24
[2014-05-25] => 2014-05-25
[2014-05-26] => Array
(
[0] => 1
[1] => 3
[2] => 4
[3] => 5
)
[2014-05-27] => Array
(
[0] => 10
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 9
[6] => 1
[7] => 6
[8] => 8
[9] => 7
)
[2014-05-28] => 2014-05-28
[2014-05-29] => 2014-05-29
[2014-05-30] => 2014-05-30
[2014-05-31] => 2014-05-31
)
I appologize for wasting your time i didnt mean to, but after i wrote the question a figured it out.
$calendar1 = array();
foreach ($calendar as $cal)
{
foreach ($report as $key => $rdate)
{
if ($key == $cal)
{
$calendar1[][$cal] = $rdate;
}
}
}

Echo all months with days calendar

I am using the code below to echo the current month. How can i enhance it so that is shows all the months with the names and days and dates..
Code:
<?php
$today = getdate();
$firstDay = getdate(mktime(0,0,0,$today['mon'],1,$today['year']));
$lastDay = getdate(mktime(0,0,0,$today['mon']+1,0,$today['year']));
?>
<?php
echo '<table>';
echo ' <tr><th colspan="7">'.$today['month']." - ".$today['year']."</th></tr>";
echo '<tr class="days">';
echo ' <td>Mo</td><td>Tu</td><td>We</td><td>Th</td>';
echo ' <td>Fr</td><td>Sa</td><td>Su</td></tr>';
?>
<?php
echo '<tr>';
for($i=1;$i<$firstDay['wday'];$i++){
echo '<td> </td>';
}
$actday = 0;
for($i=$firstDay['wday'];$i<=7;$i++){
$actday++;
echo "<td>$actday</td>";
}
echo '</tr>';
?>
<?php
$fullWeeks = floor(($lastDay['mday']-$actday)/7);
for ($i=0;$i<$fullWeeks;$i++){
echo '<tr>';
for ($j=0;$j<7;$j++){
$actday++;
echo "<td>$actday</td>";
}
echo '</tr>';
}
?>
<?php
if ($actday < $lastDay['mday']){
echo '<tr>';
for ($i=0; $i<7;$i++){
$actday++;
if ($actday <= $lastDay['mday']){
echo "<td>$actday</td>";
}
else {
echo '<td> </td>';
}
}
echo '</tr>';
}
?>
Try this:
function getDates($year)
{
$dates = array();
date("L", mktime(0,0,0, 7,7, $year)) ? $days = 366 : $days = 365;
for($i = 1; $i <= $days; $i++){
$month = date('m', mktime(0,0,0,1,$i,$year));
$wk = date('W', mktime(0,0,0,1,$i,$year));
$wkDay = date('D', mktime(0,0,0,1,$i,$year));
$day = date('d', mktime(0,0,0,1,$i,$year));
$dates[$month][$wk][$wkDay] = $day;
}
return $dates;
}
it will return an array of months->weeks->day->weekday of the year you pass to the function. Hopefully it should be easy to traverse through the array to print everything out. Am sure there are a lot of tweaks you can make to that but its a start.
I would also try and stay away from printing out html using echo, for example instead of;
echo '<tr>';
for($i=1;$i<$firstDay['wday'];$i++){
echo '<td> </td>';
}
do;
<tr>;
<?php for($i=1;$i<$firstDay['wday'];$i++){ ?>
<td><?php echo $var; ?></td>
<?php } ?>
It kind of makes the code more readable I think.
EDIT: Just thought I should include an example of a use case as well, as below:
<?php $dates = getDates(2011);
$weekdays = array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'); ?>
<?php foreach($dates as $month => $weeks) { ?>
<table>
<tr>
<th><?php echo implode('</th><th>', $weekdays); ?></th>
</tr>
<?php foreach($weeks as $week => $days){ ?>
<tr>
<?php foreach($weekdays as $day){ ?>
<td>
<?php echo isset($days[$day]) ? $days[$day] : '&nbsp'; ?>
</td>
<?php } ?>
</tr>
<?php } ?>
</table>
<?php } ?>
Which gives you the output:
You can use this function to convert entire year into array
function year2array($year) {
$res = $year >= 1970;
if ($res) {
// this line gets and sets same timezone, don't ask why :)
date_default_timezone_set(date_default_timezone_get());
$dt = strtotime("-1 day", strtotime("$year-01-01 00:00:00"));
$res = array();
$week = array_fill(1, 7, false);
$last_month = 1;
$w = 1;
do {
$dt = strtotime('+1 day', $dt);
$dta = getdate($dt);
$wday = $dta['wday'] == 0 ? 7 : $dta['wday'];
if (($dta['mon'] != $last_month) || ($wday == 1)) {
if ($week[1] || $week[7]) $res[$last_month][] = $week;
$week = array_fill(1, 7, false);
$last_month = $dta['mon'];
}
$week[$wday] = $dta['mday'];
}
while ($dta['year'] == $year);
}
return $res;
}
Call it like
print_r(year2array(2011));
You'll see this in source (months->weeks->days):
Array
(
[1] => Array
(
[0] => Array
(
[1] =>
[2] =>
[3] =>
[4] =>
[5] =>
[6] => 1
[7] => 2
)
[1] => Array
(
[1] => 3
[2] => 4
[3] => 5
[4] => 6
[5] => 7
[6] => 8
[7] => 9
)
[2] => Array
(
[1] => 10
[2] => 11
[3] => 12
[4] => 13
[5] => 14
[6] => 15
[7] => 16
)
[3] => Array
(
[1] => 17
[2] => 18
[3] => 19
[4] => 20
[5] => 21
[6] => 22
[7] => 23
)
[4] => Array
(
[1] => 24
[2] => 25
[3] => 26
[4] => 27
[5] => 28
[6] => 29
[7] => 30
)
[5] => Array
(
[1] => 31
[2] =>
[3] =>
[4] =>
[5] =>
[6] =>
[7] =>
)
)
[2] => Array
(
[0] => Array
(
[1] =>
[2] => 1
[3] => 2
[4] => 3
[5] => 4
[6] => 5
[7] => 6
)
[1] => Array
(
[1] => 7
[2] => 8
[3] => 9
[4] => 10
[5] => 11
[6] => 12
[7] => 13
)
[2] => Array
(
[1] => 14
[2] => 15
[3] => 16
[4] => 17
[5] => 18
[6] => 19
[7] => 20
)
[3] => Array
(
[1] => 21
[2] => 22
[3] => 23
[4] => 24
[5] => 25
[6] => 26
[7] => 27
)
[4] => Array
(
[1] => 28
[2] =>
[3] =>
[4] =>
[5] =>
[6] =>
[7] =>
)
)
[3] => Array
(
[0] => Array
(
[1] =>
[2] => 1
[3] => 2
[4] => 3
[5] => 4
[6] => 5
[7] => 6
)
[1] => Array
(
[1] => 7
[2] => 8
[3] => 9
[4] => 10
[5] => 11
[6] => 12
[7] => 13
)
[2] => Array
(
[1] => 14
[2] => 15
[3] => 16
[4] => 17
[5] => 18
[6] => 19
[7] => 20
)
[3] => Array
(
[1] => 21
[2] => 22
[3] => 23
[4] => 24
[5] => 25
[6] => 26
[7] => 27
)
[4] => Array
(
[1] => 28
[2] => 29
[3] => 30
[4] => 31
[5] =>
[6] =>
[7] =>
)
)
[4] => Array
(
[0] => Array
(
[1] =>
[2] =>
[3] =>
[4] =>
[5] => 1
[6] => 2
[7] => 3
)
[1] => Array
(
[1] => 4
[2] => 5
[3] => 6
[4] => 7
[5] => 8
[6] => 9
[7] => 10
)
[2] => Array
(
[1] => 11
[2] => 12
[3] => 13
[4] => 14
[5] => 15
[6] => 16
[7] => 17
)
[3] => Array
(
[1] => 18
[2] => 19
[3] => 20
[4] => 21
[5] => 22
[6] => 23
[7] => 24
)
[4] => Array
(
[1] => 25
[2] => 26
[3] => 27
[4] => 28
[5] => 29
[6] => 30
[7] =>
)
)
[5] => Array
(
[0] => Array
(
[1] =>
[2] =>
[3] =>
[4] =>
[5] =>
[6] =>
[7] => 1
)
[1] => Array
(
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
)
[2] => Array
(
[1] => 9
[2] => 10
[3] => 11
[4] => 12
[5] => 13
[6] => 14
[7] => 15
)
[3] => Array
(
[1] => 16
[2] => 17
[3] => 18
[4] => 19
[5] => 20
[6] => 21
[7] => 22
)
[4] => Array
(
[1] => 23
[2] => 24
[3] => 25
[4] => 26
[5] => 27
[6] => 28
[7] => 29
)
[5] => Array
(
[1] => 30
[2] => 31
[3] =>
[4] =>
[5] =>
[6] =>
[7] =>
)
)
[6] => Array
(
[0] => Array
(
[1] =>
[2] =>
[3] => 1
[4] => 2
[5] => 3
[6] => 4
[7] => 5
)
[1] => Array
(
[1] => 6
[2] => 7
[3] => 8
[4] => 9
[5] => 10
[6] => 11
[7] => 12
)
[2] => Array
(
[1] => 13
[2] => 14
[3] => 15
[4] => 16
[5] => 17
[6] => 18
[7] => 19
)
[3] => Array
(
[1] => 20
[2] => 21
[3] => 22
[4] => 23
[5] => 24
[6] => 25
[7] => 26
)
[4] => Array
(
[1] => 27
[2] => 28
[3] => 29
[4] => 30
[5] =>
[6] =>
[7] =>
)
)
[7] => Array
(
[0] => Array
(
[1] =>
[2] =>
[3] =>
[4] =>
[5] => 1
[6] => 2
[7] => 3
)
[1] => Array
(
[1] => 4
[2] => 5
[3] => 6
[4] => 7
[5] => 8
[6] => 9
[7] => 10
)
[2] => Array
(
[1] => 11
[2] => 12
[3] => 13
[4] => 14
[5] => 15
[6] => 16
[7] => 17
)
[3] => Array
(
[1] => 18
[2] => 19
[3] => 20
[4] => 21
[5] => 22
[6] => 23
[7] => 24
)
[4] => Array
(
[1] => 25
[2] => 26
[3] => 27
[4] => 28
[5] => 29
[6] => 30
[7] => 31
)
)
[8] => Array
(
[0] => Array
(
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
[6] => 6
[7] => 7
)
[1] => Array
(
[1] => 8
[2] => 9
[3] => 10
[4] => 11
[5] => 12
[6] => 13
[7] => 14
)
[2] => Array
(
[1] => 15
[2] => 16
[3] => 17
[4] => 18
[5] => 19
[6] => 20
[7] => 21
)
[3] => Array
(
[1] => 22
[2] => 23
[3] => 24
[4] => 25
[5] => 26
[6] => 27
[7] => 28
)
[4] => Array
(
[1] => 29
[2] => 30
[3] => 31
[4] =>
[5] =>
[6] =>
[7] =>
)
)
[9] => Array
(
[0] => Array
(
[1] =>
[2] =>
[3] =>
[4] => 1
[5] => 2
[6] => 3
[7] => 4
)
[1] => Array
(
[1] => 5
[2] => 6
[3] => 7
[4] => 8
[5] => 9
[6] => 10
[7] => 11
)
[2] => Array
(
[1] => 12
[2] => 13
[3] => 14
[4] => 15
[5] => 16
[6] => 17
[7] => 18
)
[3] => Array
(
[1] => 19
[2] => 20
[3] => 21
[4] => 22
[5] => 23
[6] => 24
[7] => 25
)
[4] => Array
(
[1] => 26
[2] => 27
[3] => 28
[4] => 29
[5] => 30
[6] =>
[7] =>
)
)
[10] => Array
(
[0] => Array
(
[1] =>
[2] =>
[3] =>
[4] =>
[5] =>
[6] => 1
[7] => 2
)
[1] => Array
(
[1] => 3
[2] => 4
[3] => 5
[4] => 6
[5] => 7
[6] => 8
[7] => 9
)
[2] => Array
(
[1] => 10
[2] => 11
[3] => 12
[4] => 13
[5] => 14
[6] => 15
[7] => 16
)
[3] => Array
(
[1] => 17
[2] => 18
[3] => 19
[4] => 20
[5] => 21
[6] => 22
[7] => 23
)
[4] => Array
(
[1] => 24
[2] => 25
[3] => 26
[4] => 27
[5] => 28
[6] => 29
[7] => 30
)
[5] => Array
(
[1] => 31
[2] =>
[3] =>
[4] =>
[5] =>
[6] =>
[7] =>
)
)
[11] => Array
(
[0] => Array
(
[1] =>
[2] => 1
[3] => 2
[4] => 3
[5] => 4
[6] => 5
[7] => 6
)
[1] => Array
(
[1] => 7
[2] => 8
[3] => 9
[4] => 10
[5] => 11
[6] => 12
[7] => 13
)
[2] => Array
(
[1] => 14
[2] => 15
[3] => 16
[4] => 17
[5] => 18
[6] => 19
[7] => 20
)
[3] => Array
(
[1] => 21
[2] => 22
[3] => 23
[4] => 24
[5] => 25
[6] => 26
[7] => 27
)
[4] => Array
(
[1] => 28
[2] => 29
[3] => 30
[4] =>
[5] =>
[6] =>
[7] =>
)
)
[12] => Array
(
[0] => Array
(
[1] =>
[2] =>
[3] =>
[4] => 1
[5] => 2
[6] => 3
[7] => 4
)
[1] => Array
(
[1] => 5
[2] => 6
[3] => 7
[4] => 8
[5] => 9
[6] => 10
[7] => 11
)
[2] => Array
(
[1] => 12
[2] => 13
[3] => 14
[4] => 15
[5] => 16
[6] => 17
[7] => 18
)
[3] => Array
(
[1] => 19
[2] => 20
[3] => 21
[4] => 22
[5] => 23
[6] => 24
[7] => 25
)
[4] => Array
(
[1] => 26
[2] => 27
[3] => 28
[4] => 29
[5] => 30
[6] => 31
[7] =>
)
)
)
So, now it's easy to create month table for every month you need using something like this
function month2table($month, $calendar_array) {
$ca = 'align="center"';
$res = "<table cellpadding=\"2\" cellspacing=\"1\" style=\"border:solid 1px #000000;font-family:tahoma;font-size:12px;background-color:#ababab\"><tr><td $ca>Mo</td><td $ca>Tu</td><td $ca>We</td><td $ca>Th</td><td $ca>Fr</td><td $ca>Sa</td><td $ca>Su</td></tr>";
foreach ($calendar_array[$month] as $month=>$week) {
$res .= '<tr>';
foreach ($week as $day) {
$res .= '<td align="right" width="20" bgcolor="#ffffff">' . ($day ? $day : ' ') . '</td>';
}
$res .= '</tr>';
}
$res .= '</table>';
return $res;
}
Use these functions like
$calarr = year2array(2011);
echo month2table(1, $calarr); // January
echo month2table(2, $calarr); // February
...
echo month2table(12, $calarr); // December
..or put months in for loop.
So... e.g. for January 2011 in your browser you'll see this
Hope this helps.
$daysArr = array('Mon','Tue','Wed','Thu','Fri','Sat','Sun');
$monthtotdays= cal_days_in_month(CAL_GREGORIAN,date('m'),date("Y"));
$currdays=jddayofweek (cal_to_jd(CAL_GREGORIAN, date('m'),1, date("Y")) , 2 );
$currdaysval = 0;
echo "<table border=1px>";
echo "<tr>";
for($d=0;$d<=6;$d++){
echo "<td>". $daysArr[$d]."</td>";
if($daysArr[$d]==$currdays) $currdaysval = $d;
}
echo "</tr>";
echo "<tr>";
if($currdaysval > 0 ){
echo '<td colspan="'.$currdaysval.'"> </td>';
}
for($i=1;$i<=$monthtotdays;$i++){
echo "<td>".$i."</td>";
if(($i+$currdaysval )%7 <= 0 ){
echo "</tr><tr>";
}
}
echo "</tr></table>"
The best answer has an inaccuracy! You should add a condition if year is leap-year BEFORE a cycle, otherwise you will have problems with output of first days of first month see screenshot.
The necessary condition: date("L", mktime(0,0,0, 7,7, $year)) ? $days = 366 : $days = 365;
(if year is leap-year then counter of cycle = 366 else 365)
Wrap your current code within a function then pass an argument to it with your desired date.

Categories