Как заполнить не достающейся даты за 7 дней в массиве PHP

У меня есть массив дат и под ними данные. Беру их я из базы данных MySql. Беру исключительно 7 штук, потому что хочу выводить данные только за неделю.

введите сюда описание изображения

На скрине только 4 даты с данными, а мне нужно 7, и соответственно num_good, num_bad должны быть нулевые так как записей в базе данных под такой дате нет. Я беру и группирую количество записей num_good и с num_bad с датой. И у некоторых дат их вообще нет, и соответственно дат нет.

Есть например записи:

2022-02-26 num_good: 1 num_bad: 0

2022-02-21 num_good: 0 num_bad: 1

...


Мне нужно:

2022-02-26 num_good: 1 num_bad: 0

2022-02-25 num_good: 0 num_bad: 0

2022-02-24 num_good: 0 num_bad: 0

2022-02-23 num_good: 0 num_bad: 0

2022-02-22 num_good: 0 num_bad: 0

2022-02-21 num_good: 0 num_bad: 1


Я пробовал только 1 способом, это с помощи цикла сначала брать текущею дату и с каждым разом уменьшать её на 1 день, и сравнивать дату в массиве, если такой нет то записать в массив эту дату с нулевыми значениями num_good, num_bad, если есть то оставить, но так что бы они были друг под другом логический, создавал я новый массив для того что бы упорядочить их. Но не вышло. Получилось каляка моляка.

Прошу вас помочь какие есть альтернативные способы сделать это, или помочь мне с тем что я вам сообщил. Я думаю застряну на долго!


Ответы (1 шт):

Автор решения: Роман Морозов

В $dates будут результаты за все предыдущие 7 дней в порядке убывания даты.

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

$day = 86400;
$fromTime = time() - ($day * 7); // 7 дней назад

$time = time();
$dates = [];
while ($time > $fromTime) {
    $date = date('Y-m-d', $time);
    $dates[$date] = [
        'data' => $date,
        'num_good' => 0,
        'num_bad' => 0,
    ];
}

$dbResults = [
    ['data' => '2022-02-26', 'num_good' => 1, 'num_bad' => 0],
    ['data' => '2022-02-21', 'num_good' => 0, 'num_bad' => 1],
    ['data' => '2022-02-20', 'num_good' => 1, 'num_bad' => 0],
    ['data' => '2022-02-19', 'num_good' => 1, 'num_bad' => 1],
    ['data' => '2022-02-18', 'num_good' => 1, 'num_bad' => 1],
];

foreach ($dbResults as $value) {
    $dates[$value['data']] = $value;
}

$dates = array_values($dates);
→ Ссылка