Затык с графиком

AlexProg

Всем добра!

upload_2021-6-3_13-50-8.png

Есть график Chart.js, с БД берутся данные.
График на месяц, т.е. 30 значений.
Если данных в БД нет — то ставится ноль.

Но на графике не должно быть нулевых значений. Там где ноль нужно взять значение следующего дня.
Вопрос: Как?

Спасибо!

 

ADSoft

тогда это не график по дням… это нечто другое
это вы хотите график по тем дням — когда было больше 0 чего-то, так и делайте выборку

 

AlexProg

Как удобно называйте :)

Выборка берет с БД, допустим 5 дней из 30 есть данные.
25 дней нули.

НО! такого же не может быть!? Курс то не стал в ноль, он был на прежнем месте.
Т.е. где ноль нужно вставить курс предыдущего дня.

 

Drunkenmunky

А если выборка начинается с 0?

 

AlexProg

В БД нет нулей.
В выборке из БД только значения.

 

Drunkenmunky

OK Перефразирую.
На вашем графике интервал с 4 мая по 3 июня.
Означает ли это, что график всегда начинается с даты с ненулевым значением чего-то там?

 

MouseZver

в js оформи фильтр на нулевое значение дней

если 30 числа — значение = 0 ? :) откуда ему знать что дальше ?

 

AlexProg

Нет. Нулей не должно быть нигде.
— Добавлено —

o_O Как, подскажите пожалуйста?

 

Drunkenmunky

Сдаюсь

 

AlexProg

:(

Куда копать? :)

 

MouseZver

сколько ?

 

Drunkenmunky

Извлечь выборку не за 30 дней, а включая последнюю запись за предыдущий интервал.
Извлеченное поместить в массив $arr1 с датами в ключах.
Проверить дату начала графика в $arr1 — если есть, то копировать в новый массив, если нет, то получить предыдущую запись.
Далее в цикле заполнять новый массив предыдущими записями в нем, если в $arr1 нет такой записи.

 

AlexProg

1 кофе

 

brevis

Напишу еще тут на всякий случай :)

Код (PHP):
  1. function removeZeros($data) {
  2.     $zero_idx = [];
  3.     $last_non_zero = 0;
  4.     foreach($data as $k => $v) {
  5.         if ($v == 0) $zero_idx[] = $k; else $last_non_zero = $v;
  6.         if ($v != 0 || $k == count($data) 1) {
  7.             foreach ($zero_idx as $i) $data[$i] = $last_non_zero;
  8.             $zero_idx = [];
  9.         }
  10.     }
  11.     return $data;
  12. }
  13.  
  14.  
  15. print_r(removeZeros([0, 0, 0, 0, 0, 0, 1]));
  16.  
  17. print_r(removeZeros([2, 0, 0, 0, 0, 0, 0]));
  18.  
  19. print_r(removeZeros([0, 3, 0, 4, 0, 5, 0]));

https://i.imgur.com/cm3xQt5.png

 

ADSoft

Чё так сложно? Array_filter и все

а по хорошему, надо просто выбору нормально сделать, с доп условием на нулевые значения

 

Drunkenmunky

Ему кривая нужна, а не кардиограмма. Включая пропущенные даты.

 

AlexProg

Всем спасибо! Проблема решена

 

ADSoft

Тогда уж не предыдущее или последнее брать а их среднеарифметическое, для большей плавности ))

 

Drunkenmunky

Судя по графику, это курс валют.
Оно не так устанавливается.
Если официальный «на сегодня» не установлен, то, обычно, ставят вчерашний. А там уже по месту ориентируются. Если есть какой-то ажиотаж местный, локально курс может весьма сильно измениться.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *