Массив дат, лет и месяцев - PullRequest
0 голосов
/ 13 июня 2018

Я искал в Интернете и обнаружил похожие проблемы, но не совсем то, что мне нужно.Я по сути после 2-х массивов для передачи в API, поэтому они должны быть в правильном формате.Первый массив, который я передаю, выглядит примерно так:

$dateArray = array(
    '2015' => '2015-01-01T00:00:00',
    '2016' => '2016-01-01T00:00:00',
    '2017' => '2017-01-01T00:00:00',
    '2018' => '2018-01-01T00:00:00'
);

На данный момент это жестко закодировано, но я хотел сделать его динамическим, поэтому мне не пришлось его обновлять.Что я знаю, так это то, что начальный год - 2015, а последний всегда будет текущим.На данный момент я пытаюсь это

$years = array_combine(range(date("Y"), 2015), range(date("Y"), 2015));

И это дает мне что-то вроде следующего:

array:4 [
  2018 => 2018
  2017 => 2017
  2016 => 2016
  2015 => 2015
]

Теперь это почти правильно, порядок лет не имеет значения, но яЯ не уверен, как лучше получить эту часть 2015-01-01T00:00:00 на правой стороне массива?

Второй массив, который я ищу, довольно похож.Начало всегда 01/2015, а текущим всегда будет текущий месяц и год.Версия в жестком коде выглядит примерно так:

$dateArray = array(
    '2015-01' => '2015-01-01T00:00:00',
    '2015-02' => '2015-02-01T00:00:00',
    '2015-03' => '2015-03-01T00:00:00',
    '2015-04' => '2015-04-01T00:00:00',
    ...
);

В этом я не уверен, я пытался

$years = array_combine(range(date("Y-m"), 2015-01), range(date("Y-m"), 2015-01));

Но это, кажется, только выводит годы.Как бы я динамически генерировать этот массив?

Ответы [ 6 ]

0 голосов
/ 13 июня 2018

Слегка измененная версия @MonkeyZeus с использованием класса DateInterval:

$start = new DateTime( '2015-01-01' );
// without `noon` it won't work if now were the first of a month
$end = new DateTime( 'today noon' ); 
$interval = new DateInterval( 'P1M' );

$period = new DatePeriod( $start, $interval, $end );

$data = array();
foreach ( $period as $date ) {
    // it would make more sense to use DATE_W3C as format ...
    $data[ $date->format( 'Y-m' ) ] = $date->format( 'Y-m-d\TH:i:s' );
}
0 голосов
/ 13 июня 2018

Это должно сделать это:

<?php
// Store your years here
$years = array();

// Store the monthly dates here
$months = array();

// This is the starting point
$start = new DateTime( '2015-01-01 00:00:00' );

// while we are working with a date which is less than the current time then keep building the array
while( $start->getTimeStamp() <= time() )
{
    // Populate a year
    $years[ $start->format( 'Y' ) ] = $start->format( 'Y' ).'-01-01T00:00:00';

    // Populate a month
    $months[ $start->format( 'Y-m' ) ] = $start->format( 'Y-m' ).'-01T00:00:00';

    // Always add a month since that is the smallest interval we need to store
    $start->modify( 'first day of +1 month' );
}

print_r( $years );
print_r( $months );

Вывод:

Array
(
    [2015] => 2015-01-01T00:00:00
    [2016] => 2016-01-01T00:00:00
    [2017] => 2017-01-01T00:00:00
    [2018] => 2018-01-01T00:00:00
)
Array
(
    [2015-01] => 2015-01-01T00:00:00
    [2015-02] => 2015-02-01T00:00:00
    [2015-03] => 2015-03-01T00:00:00
    [2015-04] => 2015-04-01T00:00:00
    [2015-05] => 2015-05-01T00:00:00
    [2015-06] => 2015-06-01T00:00:00
    [2015-07] => 2015-07-01T00:00:00
    [2015-08] => 2015-08-01T00:00:00
    [2015-09] => 2015-09-01T00:00:00
    [2015-10] => 2015-10-01T00:00:00
    [2015-11] => 2015-11-01T00:00:00
    [2015-12] => 2015-12-01T00:00:00
    [2016-01] => 2016-01-01T00:00:00
    [2016-02] => 2016-02-01T00:00:00
    [2016-03] => 2016-03-01T00:00:00
    [2016-04] => 2016-04-01T00:00:00
    [2016-05] => 2016-05-01T00:00:00
    [2016-06] => 2016-06-01T00:00:00
    [2016-07] => 2016-07-01T00:00:00
    [2016-08] => 2016-08-01T00:00:00
    [2016-09] => 2016-09-01T00:00:00
    [2016-10] => 2016-10-01T00:00:00
    [2016-11] => 2016-11-01T00:00:00
    [2016-12] => 2016-12-01T00:00:00
    [2017-01] => 2017-01-01T00:00:00
    [2017-02] => 2017-02-01T00:00:00
    [2017-03] => 2017-03-01T00:00:00
    [2017-04] => 2017-04-01T00:00:00
    [2017-05] => 2017-05-01T00:00:00
    [2017-06] => 2017-06-01T00:00:00
    [2017-07] => 2017-07-01T00:00:00
    [2017-08] => 2017-08-01T00:00:00
    [2017-09] => 2017-09-01T00:00:00
    [2017-10] => 2017-10-01T00:00:00
    [2017-11] => 2017-11-01T00:00:00
    [2017-12] => 2017-12-01T00:00:00
    [2018-01] => 2018-01-01T00:00:00
    [2018-02] => 2018-02-01T00:00:00
    [2018-03] => 2018-03-01T00:00:00
    [2018-04] => 2018-04-01T00:00:00
    [2018-05] => 2018-05-01T00:00:00
    [2018-06] => 2018-06-01T00:00:00
)
0 голосов
/ 13 июня 2018

Вы можете запустить это на $years, если вам по какой-то причине не нравятся циклы в вашем коде.

array_walk($years, function(&$val) { $val = sprintf('%d-01-01T00:00:00', $val); });

0 голосов
/ 13 июня 2018
<?php
$keyArr = range(date("Y"), 2015);
$valArr = array_map(function($a){return $a.'-01-01-T00:00:00';},$keyArr);
$years = array_combine($keyArr,$valArr);
?>

Это даст вам желаемый результат.

0 голосов
/ 13 июня 2018

Я рекомендую вам использовать класс DateTime, используя метод DateTime::createFromFormat().

<?php

$startYear = 2010;
$array = [];

for ($x = $startYear; $x <= date('Y'); $x ++) {
    $date = DateTime::createFromFormat('Y-m-d\TH:i:s', $x . '-01-01T00:00:00');
    $array[$x] = $date->format('Y-m-d\TH:i:s');
}

var_dump($array);

Это выдаст:

array(9) { 
[2010]=> string(19) "2010-01-01T00:00:00" 
[2011]=> string(19) "2011-01-01T00:00:00" 
[2012]=> string(19) "2012-01-01T00:00:00" 
[2013]=> string(19) "2013-01-01T00:00:00" 
[2014]=> string(19) "2014-01-01T00:00:00" 
[2015]=> string(19) "2015-01-01T00:00:00" 
[2016]=> string(19) "2016-01-01T00:00:00" 
[2017]=> string(19) "2017-01-01T00:00:00" 
[2018]=> string(19) "2018-01-01T00:00:00" 
}

Что вы можете увидеть сами, нажав здесь https://3v4l.org/9gVRg

Теоретически вы можете просто сделать это в виде строк, но вам стоит потратить время на игру с классом DateTime.http://php.net/manual/en/class.datetime.php, возможно, даже просто сохраняя объект вместо строки в вашем массиве.

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

<?php

$array2 = [];
$year = 2010;
for ($x = 1; $x <= 12; $x ++) {
    $array2[$year.'-'.$x] = (new DateTime($year.'-'.$x.'-01T00:00:00'))->format('Y-m-d\TH:i:s');
}

var_dump($array2);

И снова код здесь https://3v4l.org/C5hQ7

0 голосов
/ 13 июня 2018

Если он всегда начинается с 2015 года и всегда с 1 января, как показано, простой цикл должен работать.

for ($Y = 2015; $Y <= date('Y'); $Y++) {
    $yearArray[$Y] = $Y . '-01-01T00:00:00';
    $months = $Y < date('Y') ? 12 : date('n');

    for ($m = 1; $m <= $months; $m++) {
        $arrayKey = sprintf('%d-%02d', $Y, $m);
        $monthArray[$arrayKey] = $arrayKey . '-01T00:00:00';
    }
}
...