2008-12-03 2 views
3

На странице я хочу динамически перечислять годы и все месяцы в году, чтобы можно было просмотреть архив за каждый месяц. Я хочу показать текущий год первым, но текущий год может не закончиться, поэтому я хочу показать только прошедшие месяцы и текущий месяц. Затем я хочу все годы и все месяцы в прошлом с этого года (т. Е. 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'); 
    } 
} 
+0

Почему вы храните значения? Вы можете сделать это намного быстрее, если вы просто выберете значения, не сохраняя их в первую очередь. –

+0

Их нужно хранить, чтобы они могли быть переданы Smarty, который используется для шаблонов. – DavidM

ответ

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

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

+0

Да, похоже, быстрее. 0.000255 0.000293 0.000291 = avrg 0.000279 – DavidM

0

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

-> Get current Year 

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

    -> Print Month 
+0

Спасибо, но я знаю, как это сделать. Я хочу знать, может ли мой код быть более эффективным или нет. – DavidM

2

попробовать это будет из положить список нисходящих месяцев/лет за последние 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>'; 
    } 
} 
+0

Это будет выводить все месяцы за последние 5 лет, тогда как в текущем году я хочу только вывести пройденные месяцы, включая текущий месяц. Это нормально для декабря 2008 года, так как все месяцы прошли, но в феврале 2009 года я хотел бы показать, например, Jan и Feb. – DavidM

+0

Вы имеете в виду, что в феврале 2009 года он покажет марш..декабря 2004 года? поскольку -1 месяц работает с текущей даты, он никогда не будет показывать будущие даты, поскольку strtotime имеет отрицательное значение в нем. – Re0sless

+0

Я добавил if, но не имею php-сервер у себя дома, чтобы проверить его – Re0sless

1

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

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

Спасибо, но ваш код медленнее. Мой код выполнен в 0.000391 0.000319 и 0.000316 со средним значением 0,000342. Ваш код выполнен в 0.000361 0.000326 и 0.000325 со средним значением 0.000349. Минимальные различия, но ваш код также выглядит более сложным и, следовательно, менее читаемым. – DavidM

+1

Мой код более гибкий. Мне также легче читать 2 страницы избыточного кода. – OIS

+0

Код, который мне нужен, не обязательно должен быть гибким. Вы считаете, что вам легче читать, потому что вы его написали. – DavidM

1
$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; 
} 
+0

это быстрее, чем у меня? – Jack

Смежные вопросы