У меня есть массив вида
[
[date => "06-2020", name => "Vanaya"],
[date => "01-2020", name => "Petya"],
[date => "04-2019", name => "Grizha"],
[date => "011-2019", name => "Oleg"]
]
Мне нужно построить график статистики за определенный период, проблема в том, что график должен быть помесячным, т.е. если для месяца нет элементов, то отображается ноль.
Как это делаю сейчас, довольно топорно, уверен можно сильно упростить
$arItems = [];
$result = [];
$result['created_date_min'] = 'now';
$result['created_date_max'] = 0;
foreach ($arItems['item'] as &$elem) {
// unix time
$date = strtotime($elem['created_date']);
// получим перебором самую маленькую и большую даты
if ((int)strtotime($result['created_date_min']) > (int)$date) {
$result['created_date_min'] = date('d.m.Y', $date);
}
if ((int)strtotime($result['created_date_max']) < (int)$date) {
$result['created_date_max'] = date('d.m.Y', $date);
}
// массив вида [дата => количество элементов]
$result['count_dates'][date('m.Y', $date)]++;
}
// пустой помесячный массив
$result['by_month'] = getMonth($result['created_date_min'], $result['created_date_max']);
for ($i = 0, $count = count($result['by_month']); $i < $count; $i++) {
$date = $result['by_month'][$i];
$result['points'][$i] = [
'date' => $date,
'count' => (int)$result['count_dates'][$date]
];
}
function getMonth($min, $max)
{
$res = [];
$min = new DateTime($min);
$max = new DateTime($max);
$diff = $max->diff($min);
// если месяцев больше 12ти
$diff = $diff->m + 12 * $diff->y;
for ($i = 0; $i < $diff; $i++) {
$nowTemp = new DateTime();
$dateMonth = $nowTemp->sub(new DateInterval('P' . $i . 'M'));
$dateMonth = $dateMonth->format('m.Y');
$res[] = $dateMonth;
}
return $res;
}