У меня есть массив PHP, который я использую, чтобы нарисовать график
JSON формат:
{"y":24.1,"x":"2017-12-04 11:21:25"},
{"y":24.1,"x":"2017-12-04 11:32:25"},
{"y":24.3,"x":"2017-12-04 11:33:30"},
{"y":24.1,"x":"2017-12-04 11:34:25"},
{"y":24.2,"x":"2017-12-04 11:35:35"},.........
{"y":26.2,"x":"2017-12-04 11:36:35"}, ->goes up for about a minute
{"y":26.3,"x":"2017-12-04 11:37:35"},.........
{"y":24.1,"x":"2017-12-04 11:38:25"},
{"y":24.3,"x":"2017-12-04 11:39:30"}
у = температура, а х значение дата,
Как вы можете видеть, температура меняется не так часто, даже если она изменяется только на максимум 0,4. Но иногда после длительного периода схожих значений оно меняется более чем на 0,4.
Я хотел бы объединить эти аналогичные значения, чтобы в графе не было 200 тыс. Похожих значений, а были бы только те, которые «важны».
Мне нужен совет, как сделать или какой алгоритм будет идеальным для создания оптимизированного массива, как я хотел бы.
идеальный выход:
{"y":24.1,"x":"2017-12-04 11:21:25"},.........
{"y":24.1,"x":"2017-12-04 11:34:25"},
{"y":24.2,"x":"2017-12-04 11:35:35"},.........
{"y":26.2,"x":"2017-12-04 11:36:35"}, ->goes up for about a minute
{"y":26.3,"x":"2017-12-04 11:37:35"},.........
{"y":24.1,"x":"2017-12-04 11:38:25"}
Любая помощь?
Как вы указали php
Я собираюсь предположить, что вы можете справиться с этим на выходной стороне.
По сути, вам нужна логика типа «если абсолютное значение температуры намного превышает последнюю температуру или время больше, чем в прошлый раз на x минут, то давайте выведем точку на графике». Если это так, вы можете получить результат следующим образом:
$temps = array(); //your data in the question
$temp = 0;
$time = 0;
$time_max = 120; //two minutes
$temp_important = .4; //max you'll tolerate
$output = [];
foreach($temps as $point){
if(strtotime($point['x']) - $time > $time_max || abs($point['y'] - $temp) >= $temp_important){
// add it to output
$output[] = $point;
}
//update our data points
if(strtotime($point['x']) - $time > $time_max){
$time = strtotime($point['x']);
}
if(abs($point['y'] - $temp) >= $temp_important){
$temp = $point['y'];
}
}
// and out we go..
echo json_encode($output);
Хм, это не совсем то, что вы просите, как если бы температура резко возросла, а затем сразу понизилась, вам нужно изменить свою логику — но подумайте об этом с точки зрения требований.
Если вы ПОЛУЧАЕТЕ данные на стороне вывода, я бы написал что-то в javascript, чтобы сохранить эти точки в / из и использовать ту же логику. Возможно, вам придется буферизовать 2-3 балла, чтобы принять решение. Ваша логика здесь выполняет важную задачу, поэтому вы хотите инкапсулировать ее и убедиться, что вы можете легко указать параметры.
Других решений пока нет …