По заданному массиву найдите нулевые значения и замените их средним значением непосредственно граничащих значений.
У меня есть массив данных о температуре за час. Некоторые часы имеют нулевые данные вместо временной. При построении графиков с помощью Google Charts ноль приводит к падению линейного графика. Мое временное исправление состояло в том, чтобы заменить нулевые значения нулевыми, что привело к разрыву линейного графика. Идеальным решением было бы взять значения по обе стороны от нуля и усреднить их. Массив в порядке по часам. Помогите?
$array = array(
"1AM" => "65",
"2AM" => "66",
"3AM" => "68",
"4AM" => "68",
"5AM" => "68",
"6AM" => "0",
"7AM" => "70",
"8AM" => "71",
"9AM" => "71",
"10AM" => "73",
);
Вот мой скрипт, заменяющий 0 нулями:
$array = array ();
foreach($parsed_json->history->observations as $key => $value) {
$temp = (int)$value->tempi;
if ($temp==0) {
str_replace(0, null, $temp);
}
$hour = $value->date->hour;
$array[$hour] = $temp;
};
Этот пример отлично работал бы, если бы данные были моими, но, увы, это из фида JSON.
Буду ли я использовать array_walk() вроде сделки? Как бы я сослаться на текущее место в массиве? Любая помощь приветствуется!
3 ответа
Я бы вычеркнул нулевую часть, и просто foreach-цикл через окончательный массив.
Итак, измените ваш текущий код на:
$array = array ();
foreach($parsed_json->history->observations as $key => $value) {
$temp = (int)$value->tempi;
}
$hour = $value->date->hour;
$array[$hour] = $temp;
И добавьте это ниже этого:
foreach($array as $hour => $temp){
if($temp == "0"){
$numHour = $hour[0];
$hourPlus = ($numHour + 1) . "AM";
$hourMinus = ($numHour - 1) . "AM";
$valuePlus = $array[$hourPlus];
$valueMinus = $array[$hourMinus];
$average = ($valuePlus + $valueMinus)/2;
$array[$hour] = $average;
}
}
?>
Это, конечно, предполагает, что значения по обе стороны от нуля также не равны нулю. Вы можете добавить проверку для этого где-то там.
Проверенный и проверенный метод.
Не могли бы вы сделать что-то вроде:
str_replace(0, ((($key-1)+($key+1))/2), $temp);
Где $key - позиция массива, возьмите значение до 0, а после 0 добавьте их и разделите на 2, чтобы получить среднее значение.
Я позволю вам разобраться, что произойдет, если первое, последнее или последовательные значения равны 0.
$the_keys=array_keys($array);
foreach($the_key as $index=>$key)
{
if($array[$key]==0)
{
$array[$key]=($array[$the_key[$index-1]]+$array[$the_key[$index+1]]/2);
}
}