Я прочитал ответ @ Шибон , и он выглядит хорошо
У меня такая же ситуация при создании диаграмм на основе https://github.com/ConsoleTVs/Charts
Так что у меня естьсоздал для него функцию
Вот мой массив только со значениями, но мне нужно установить другие значения на ноль, поэтому я создал свою собственную функцию
$arrayWithValues =
[
'02' => '20',
'09' => '45',
'15' => '68',
'21' => '28'
];
$defaultEmptyArray = [
'00' => '0',
'01' => '0',
'02' => '0',
'03' => '0',
'04' => '0',
'05' => '0',
'06' => '0',
'07' => '0',
'08' => '0',
'09' => '0',
'10' => '0',
'11' => '0',
'12' => '0',
'13' => '0',
'14' => '0',
'15' => '0',
'16' => '0',
'17' => '0',
'18' => '0',
'19' => '0',
'20' => '0',
'21' => '0',
'22' => '0',
'23' => '0',
];
Теперь нам нужно заменитьтолько массив, который имеет значение, и я написал свою собственную функцию
function setUnsettedArray($actulHourWithValue = [] ,$defaultEmptyArray = [])
{
$arraNotExists = [];
foreach ($defaultEmptyArray as $defKey => $defValue)
{
if (array_key_exists($defKey, $actulHourWithValue))
{
$arrayEXists[] = [$defKey => $actulHourWithValue[$defKey]];
}
elseif (!array_key_exists($defKey, $actulHourWithValue))
{
$arraNotExists[] = [$defKey => $defValue];
}
}
$newArray = array_merge($arraNotExists,$arrayEXists);
foreach ($newArray as $newKey => $newValue)
{
$keys[] = $newKey;
foreach ($newValue as $key => $value)
{
$allKesy[] = $key;
$allValues[] = $value;
}
}
$finalArray = array_combine($allKesy,$allValues);
ksort($finalArray);
return $finalArray;
}
и попробуйте передать массив как print_r(setUnsettedArray($arrayWithValues,$defaultEmptyArray));
и вот скрипка для него
http://phpfiddle.org/main/code/sfq3-adyn
Я отредактировал setUnsettedArray
функцию
function setUnsettedArray(array $arrayWithValues ,array $defaultArray)
{
$finalArray = $arrayWithValues+$defaultArray;
ksort($finalArray);
return $finalArray;
}
И я видел Ваш запрос, и он не очень хорош
Так что попробуйте это
$lastTwentyFour = Report::where('site_id','=',$site->id)
->whereDate('created_at', '=', Carbon::now()->subHours(24))
->orderBy('created_at')
->get()
->groupBy(function($date)
{
return Carbon::parse($date->created_at)->format('H');
}
);
и вы можете посчитать каждый час сбора как
foreach ($lastTwentyFour as $newGroupByKey => $newGroupByValue)
{
$eachHour[] = $newGroupByKey;
$eachHourCount[] = $newGroupByValue->count();
}
$actulHourWithValue = array_combine($eachHour,$eachHourCount);