Есть ли более эффективный способ создания списка лет / месяцев? - PullRequest
3 голосов
/ 03 декабря 2008

На странице я хочу динамически перечислять годы и все месяцы каждого года, чтобы можно было просмотреть архив за каждый месяц. Сначала я хочу показать текущий год, но текущий год еще не закончился, поэтому я хочу показать только прошедшие месяцы и текущий месяц. Тогда я хочу, чтобы все годы и все месяцы были в прошлом, начиная с этого года (т.е. 2008).

Ниже приведен PHP-код, который выполняет эту работу. Есть ли более эффективный способ достижения этого? Я использую 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');
    }
} 

Ответы [ 5 ]

2 голосов
/ 09 декабря 2008
$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;
    }
}

Это кажется немного проще ... это быстрее ...?

2 голосов
/ 03 декабря 2008

попробуйте это, он выведет нисходящий список месяцев / лет за последние 5 лет

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

Тогда, если вам это нужно в массиве, просто добавьте к нему, как вы идете, вот так

$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>';
    }
}
1 голос
/ 13 декабря 2008
$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 голос
/ 03 декабря 2008

Пересмотренный

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));
0 голосов
/ 03 декабря 2008

PHP имеет функцию Date () и функцию mktime, вы можете использовать их для сравнения дат и создания дат из строк и т. Д. Не предоставляя код, я могу дать вам инструкцию как-то сделать итерацию:

  -> Get current Year

  -> Loop the current year untill the current month is reached

     -> Print Month
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...