Is there a more efficient way to create a list of years / months?

On the page I want to dynamically list the years and all months of the year so that you can view the archive for each month. I want to show the current year first, but the current year may not end, so I want to show only the past months and the current month. Then I want all the years and all months in the past from this year (i.e. 2008).

The PHP code I created does the work below. Is there a more efficient way to achieve this? I am running PHP 5.2.

$current_year = date('Y'); $months = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); // Loop through all the months and create an array up to and including the current month foreach ($months as $month) { if ($month <= date('m')) { switch ($month) { case 1: $years[$current_year][] = 'January'; break; case 2: $years[$current_year][] = 'February'; break; case 3: $years[$current_year][] = 'March'; break; case 4: $years[$current_year][] = 'April'; break; case 5: $years[$current_year][] = 'May'; break; case 6: $years[$current_year][] = 'June'; break; case 7: $years[$current_year][] = 'July'; break; case 8: $years[$current_year][] = 'August'; break; case 9: $years[$current_year][] = 'September'; break; case 10: $years[$current_year][] = 'October'; break; case 11: $years[$current_year][] = 'November'; break; case 12: $years[$current_year][] = 'December'; break; } } } // Previous years $years_to_create = $current_year - 2008; if (!empty($years_to_create)) { for ($i = 1; $i <= $years_to_create; $i++) { $years[$current_year - $i] = array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); } } 
+3
source share
5 answers
 $current_year = date('Y'); $months = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); $month_names = array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); // Loop through all the months and create an array up to and including the current month for ($month=1;$month<=date('m');$month++) { $years[$current_year][] = $month_names[$month-1]; } // Previous years $years_to_create = $current_year - 2008; if (!empty($years_to_create)) { for ($i = 1; $i <= $years_to_create; $i++) { $years[$current_year - $i] = $month_names; } } 

It seems a little easier ... is it faster ...?

+2
source

try this, it will come out of the descending list of months / years over the last 5 years.

 $years = 5; for ($i = 0; $i < (12* $years); $i++) { if (date('Y',strtotime("-".$i." month")) > (date('Y') - $years) ) { echo date('F Y',strtotime("-".$i." month")) . '<br />'; } } 

Then, if you need it in the array, just add it as you go like that

 $years = 5; $myarray = array(); for ($i = 0; $i < (12* $years); $i++) { if (date('Y',strtotime("-".$i." month")) > (date('Y') - $years) ) { $year_key = date('Y') - date('Y',strtotime("-".$i." month")); $myarray[$year_key][] = date('F',strtotime("-".$i." month")); } } //Write it out to the screen foreach ($myarray as $yearkey=>$eachyear) { foreach ($eachyear as $eachmonth) { echo (date('Y')-$yearkey) . ' ' . $eachmonth . '<br>'; } } 
+2
source

After completion

 function getMonthsFromYear($start = 2008, $end = null, array $months = null) { static $sMonths = array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); $thisYear = intval(date('Y')); if (!is_array($months) || (count($months) < 12)) $months = $sMonths; if (!is_int($end)) $end = $thisYear; if ($end > $thisYear) return array_fill($start, $end - $start + 1, $months); if ($start < $end) $monthsInDuration = array_fill($start, $end - $start, $months); $monthsInDuration[$end] = array_slice($months, 0, (int) date('m')); return $monthsInDuration; } print_r(getMonthsFromYear()); print_r(getMonthsFromYear(2006)); print_r(getMonthsFromYear(2008, 2010)); 
+1
source
 $current_year = date('Y'); $month_names = array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); $years[$current_year] = array_slice($month_names, 0, date('m')); for ($i = 2008; $i < $current_year; $i++) { $years[$i] = $month_names; } 
+1
source

PHP has a Date () function and a mktime function, you can use them to compare dates and create dates from strings, etc. Without providing the code, I can give you instructions to somehow iterate:

  -> Get current Year -> Loop the current year untill the current month is reached -> Print Month 
0
source

All Articles