У меня есть массив, содержащий даты последних 7 дней, этот массив создается с помощью цикла o.
$now = new \DateTime();
$startDate = $now->modify('-6 day');
$labels = [];
$data = [];
for ($i = 0; $i <= 6; $i++) {
$day = $startDate->modify('+1 day');
$labels[] = $day->format('Y-m-d');
}
и это вывод $labels:
$labels = array:7 [▼
0 => "2023-07-05"
1 => "2023-07-06"
2 => "2023-07-07"
3 => "2023-07-08"
4 => "2023-07-09"
5 => "2023-07-10"
6 => "2023-07-11"
]
И у меня есть запрос на выбор количества просмотров элемента (свойства) в эти даты. Этот запрос может вернуть 7 строк, так как он может вернуть менее 7 или 0 строк, если в какой-либо из дней нет просмотров. В моем случае у меня есть посещения только за последние два дня, и это результат:
$result = array:2 [▼
0 => array:2 [▶
"numberViews" => 20
"dayDate" => "2023-07-10"
]
1 => array:2 [▶
"numberViews" => 32
"dayDate" => "2023-07-11"
]
]
Что я хотел бы сделать, так это проверить каждую дату в первом массиве, если она существует в группе массивов, возвращаемых запросом, если она не существует, поэтому она должна быть равна нулю, и сделать массив данных следующим образом:
$data = [0,0,0,0,0,20,32]






Сначала вам нужно инициализировать ваш массив $data, чтобы он имел те же ключи массива, что и ваш массив $labels.
for ($i = 0; $i <= 6; $i++) {
$day = $startDate->modify('+1 day');
$labels[] = $day->format('Y-m-d');
$data[] = 0;
}
Теперь вы можете перебрать свой массив $result и использовать функцию php array_search для подсчета количества просмотров.
foreach($result as $item)
{
$foundKey = array_search($item['dayDate'], $labels);
if ($foundKey !== false)
{
$data[$foundKey] += $item['numberViews'];
}
}
Вы можете сделать это в два простых шага:
$result и замените 0 на количество просмотров для дат, представленных в $result.$labels = [
0 => "2023-07-05",
1 => "2023-07-06",
2 => "2023-07-07",
3 => "2023-07-08",
4 => "2023-07-09",
5 => "2023-07-10",
6 => "2023-07-11",
];
$result = [
0 => [
"numberViews" => 20,
"dayDate" => "2023-07-10",
],
1 => [
"numberViews" => 32,
"dayDate" => "2023-07-11",
],
];
// 1. create the output array; set the dates/labels as keys and 0 as values
$output = array_fill_keys($labels, 0);
// 2. fill the number of views for the dated that have views
foreach ($result as $day) {
// Modify only the values that exist in $output
if (isset($output[$day['dayDate']])) {
// Use addition instead of assignment to guard for duplicate dates in $result
$output[$day['dayDate']] += $day['numberViews'];
}
}
print_r($output);
Вы можете объединить шаг № 1 в свой существующий код, чтобы сгенерировать $output вместо $labels (и вам больше не нужен шаг № 1 выше):
$now = new \DateTime();
$startDate = $now->modify('-6 day');
$output = [];
$data = [];
for ($i = 0; $i <= 6; $i++) {
$day = $startDate->modify('+1 day');
$output[$day->format('Y-m-d')] = 0;
}
Проверьте это онлайн.
Я согласен с первым недостатком, но зачем $result содержать несколько записей с одним и тем же dayDate?
Я не знаю. :-) Не должна. Но функция для создания массива $result неизвестна. И благодаря навыкам аскеров это могло произойти.
Этот ответ не будет работать должным образом. Предполагая, что у вас есть dayDate "2023-06-01" в вашем массиве $result, это также будет добавлено в массив $output. Далее у вас будет неправильное количество просмотров, если в вашем массиве $result будет две записи с одинаковым dayDate.