По заданному массиву найдите нулевые значения и замените их средним значением непосредственно граничащих значений.

У меня есть массив данных о температуре за час. Некоторые часы имеют нулевые данные вместо временной. При построении графиков с помощью 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);
    }
}
Другие вопросы по тегам