получать все месяцы между 2 датами

Я создал функцию, которая возвращает массив, содержащий каждый месяц, начиная с указанной даты углерода и заканчивая текущей датой.

Хотя функция делает то, что должна, она выглядит отвратительно. Очевидно, мои навыки программирования еще не то, что они должны быть. Конечно, должен быть лучший способ достичь того, чего я хочу.

Мой код выглядит так:

    class DateUtilities {
protected $months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];

public function getMonthListFromDate(Carbon $date)
{
$monthArray = array();
$today = Carbon::today();

$currentYear = $today->copy()->format('Y');
$currentMonth = strtolower($today->copy()->format('F'));

$startYear = $date->copy()->format('Y');
$startMonth = strtolower($date->copy()->format('F'));

for($i = $startYear; $i <= $currentYear; $i ++) {
foreach($this->months as $monthIndex => $month) {
if (($monthIndex >= array_search($startMonth, $this->months) && $i == $startYear) ||
($monthIndex <= array_search($currentMonth, $this->months) && $i == $currentYear) ||
($i != $startYear && $i != $currentYear)) {
$formattedMonthIndex = ($monthIndex + 1);

if($formattedMonthIndex < 10) {
$monthArray['0' . $formattedMonthIndex . '-' . $i] = $month . ' ' . $i;
} else {
$monthArray[$formattedMonthIndex . '-' . $i] = $month . ' ' . $i;
}
}
}
}

return $monthArray;
}
}

и результат:

array:25 [▼
"03-2013" => "march 2013""04-2013" => "april 2013""05-2013" => "may 2013""06-2013" => "june 2013""07-2013" => "july 2013""08-2013" => "august 2013""09-2013" => "september 2013""10-2013" => "october 2013""11-2013" => "november 2013""12-2013" => "december 2013""01-2014" => "january 2014""02-2014" => "february 2014""03-2014" => "march 2014""04-2014" => "april 2014""05-2014" => "may 2014""06-2014" => "june 2014""07-2014" => "july 2014""08-2014" => "august 2014""09-2014" => "september 2014""10-2014" => "october 2014""11-2014" => "november 2014""12-2014" => "december 2014""01-2015" => "january 2015""02-2015" => "february 2015""03-2015" => "march 2015"]

Может ли кто-нибудь помочь мне улучшить этот код?

РЕДАКТИРОВАТЬ:

После хороших советов я получил следующее:

class DateUtilities {

public function getMonthListFromDate(Carbon $start)
{
$start = $start->startOfMonth();
$end   = Carbon::today()->startOfMonth();

do
{
$months[$start->format('m-Y')] = $start->format('F Y');
} while ($start->addMonth() <= $end);

return $months;
}

}

Спасибо за помощь, ребята!

2

Решение

С DateTime это может быть легко достигнуто.

  1. Создайте объект datetime для каждой даты начала и окончания
  2. Установите интервал в 1 месяц
  3. Получить набор дат между начальной и конечной датами с интервалом в 1 месяц

Пример :

public function getMonthListFromDate(Carbon $date)
{
$start    = new DateTime(); // Today date
$end      = new DateTime($date->toDateTimeString()); // Create a datetime object from your Carbon object
$interval = DateInterval::createFromDateString('1 month'); // 1 month interval
$period   = new DatePeriod($start, $interval, $end); // Get a set of date beetween the 2 period

$months = array();

foreach ($period as $dt) {
$months[] = $dt->format("F Y");
}

return $months;
}

Посмотрите это в действии: http://3v4l.org/smS3N

5

Другие решения

Вот пример, который намного короче и проще. Вы можете легко адаптировать его к соглашениям вашего класса Carbon:

$start = strtotime('last month', strtotime('2013-03'));
$now = time();

while(($start = strtotime('next month', $start)) <= $now) {
$result[date('m-Y', $start)] = strtolower(date('F Y', $start));
}
2

По вопросам рекламы [email protected]