Как заполнить не достающейся даты за 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);
