#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. Спасибо вам за это решение, я внедрил его и подтвердил, что оно работает так, как задумано.