PHP Слияние двух непрерывных массивов данных временных рядов путем выравнивания метки времени

#php #arrays #merge

#php #массивы #слияние

Вопрос:

У меня есть основной массив данных, который всегда состоит из 600 секунд данных в порядке возрастания времени. Данные выглядят следующим образом:

 [{'timestamp' => '2016-10-10T10:00:00', 'p_value' => 55 },
{'timestamp' => '2016-10-10T10:00:01', 'p_value' => 57 },
{'timestamp' => '2016-10-10T10:00:02', 'p_value' => 51 },
{'timestamp' => '2016-10-10T10:00:03', 'p_value' => 54 },
{'timestamp' => '2016-10-10T10:00:04', 'p_value' => 48 }]
  

У меня есть вторичный массив, который содержит до 600 секунд данных. Эти данные представляют собой непрерывное «подмножество» временных меток основного массива данных, однако начальные (и конечные) значения временных меток могут различаться:

 [{'timestamp' => '2016-10-10T10:00:01', 's_value' => 1221 },
{'timestamp' => '2016-10-10T10:00:02', 's_value' => 4322 },
{'timestamp' => '2016-10-10T10:00:03', 's_value' => 2414 },]
  

Как мне «выровнять» вторичный массив с основным с помощью метки времени, а затем добавить «s_values» в основной массив наиболее эффективным с точки зрения вычислений способом?

Я уже реализовал что-то очень похожее, используя вложенные циклы foreach, однако я думаю, что это сложность O (N ^ 2).

Ответ №1:

Предполагая, что первый массив находится внутри $firstArr , а второй массив находится внутри $secondArr , а также предполагая, что

$secondArr[count($secondArr)-1]['timestamp] <= $firstArr[count($firstArr)-1]['timestamp'])

это означает, что второй массив не содержит метки времени, которая может отсутствовать в первом, тогда следующий код выполняет слияние, которое вы хотите, за линейное время (нет O (n ^ 2))

Он начинается с поиска первой метки $secondArr времени inside $firstArr и сохранения ее индекса в переменной. Затем он копирует значения p_values, начиная с этого индекса.

 for($i=0; $i<count($firstArr); $i  )
{
    if($firstArr[$i]['timestamp'] == $secondArr[0]['timestamp'])
    {
        $startingIndex = $i;
        break;
    }
}

for($i=0; $i<count($secondArr); $i  )
{
    $firstArr[$startingIndex $i]['s_value'] = $secondArr[$i]['s_value'];
}
  

Комментарии:

1. Спасибо вам за это решение, я внедрил его и подтвердил, что оно работает так, как задумано.