#javascript #php #laravel #loops #chart.js
#javascript #php #laravel #циклы #chart.js
Вопрос:
Отображение отчета о данных за последние 24 часа .. Если отчет не был создан в течение часа, по умолчанию вставляется ноль.
Мой запрос:
$dayReport = Report::select(DB::raw("HOUR(created_at) as hourNo,SUM(site_id) as count"))
->where('site_id',$site->id)
->whereDate('created_at','>=', CarbonCarbon::now()->subHours(24))
->orderBy("created_at")
->groupBy(DB::raw("hour(created_at)"))
->get()
->toArray();
Выводится следующим образом:
data: [0,2,4,2,2,0,0,0,0,0,0,0,0,0,0,5,6,7,0,8,0,6,10,22]
Мой вывод:
data: [2,4,2,2]
Это данные диаграммы Js в Javascript, значение по умолчанию 0, в течение 1 часа отчет не создается.
Заранее благодарю вас…
Комментарии:
1. В этом примере вам следует избегать
groupBy
инструкции. Group by не будет принимать все0
, и если имеется несколько записей по 2, 4, то потребуется только одна запись. Также, пожалуйста, присвоите столбцу hour значение по умолчанию0
. Поэтому, когда запись будет вставлена без чего-либо, по умолчанию она будет равна нулю.2. не могли бы вы, пожалуйста, поделиться своей структурой таблицы?
3. Запуск цикла… Временная метка таймера за последние 24 часа@MayankDudakiya
4. Запуск цикла… Временная метка таймера за последние 24 часа@Shibon
5. Структура таблицы не используется..@ Shibon
Ответ №1:
Из запроса вы получите час и сумму, если это так .. вы можете попробовать приведенный ниже код
$results = array(array('hour' => 2, 'count' => 3), array('hour' => 3, 'count' => 3), array('hour' => 13, 'count' => 10));
$hours = array(1,2,3,4,5,6,7,8,9,10,11,12,13); //up to 24
$finalResult = [];
foreach($hours as $hour){
$hourSearch = array_search($hour, array_column($results, 'hour'));
if(is_numeric($hourSearch)) {
// array_push($finalResult, $results[$hourSearch]);
array_push($finalResult,$results[$hourSearch]['count']);
} else {
// $data['hour'] = $hour;
// $data['count'] = 0;
//array_push($finalResult, $data);
array_push($finalResult,0);
}
}
echo json_encode($finalResult);
http://sandbox.onlinephpfunctions.com/code/d3c04e3b58b01b9f70652a3398379d867453b0ea
Ответ №2:
Кажется, я не совсем понимаю ваш вопрос, но использование carbon очень помогло бы, когда дело доходит до работы с датами, это сократило бы ваш код на много строк. `$now = Carbon Carbon::now; $ hoursBefore = $now-> Субботы (1);
$reports = Report::where(‘site_id’, $site-> id)-> whereBetween(‘created_at’, [$hoursBefore, $now])-> get()-> toArray(); `
Я надеюсь, что это поможет. Спасибо, удачи и удачного кодирования …. 🙂
Комментарии:
1. какой ответ вы получаете?
2.
[2,2,4]
результат получения
Ответ №3:
я прочитал ответ от @Shibon, и он выглядит хорошо
у меня такая же ситуация при создании диаграмм на основе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);
Комментарии:
1. например, в 1 час ночи в not report создается значение по умолчанию 0, созданное в chartjs. в 2 часа ночи отчет создан 16 в chart js … отчет за 24 часа отображается в chartjs @Manojkiran.A
2. вы хотите за 12 часов??
3. не могли бы вы, пожалуйста,
dd()
ввести$lastTwentyFour
переменную и показать результат4. результат таков:
[0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,7,0,0,0,3,0,0,1,4]
пример результата… Мой вывод, как правило, отличается от вывода..5. пожалуйста, посмотрите скриншот, прикрепленный здесь i.imgur.com/m1jtQRN.png в этом число
16
обозначает4PM
, получаете ли вы подобное. Пожалуйста, приложите скриншот