PHP通过对齐时间戳来合并两个连续时间序列数据数组

时间:2016-10-12 08:44:59

标签: php arrays merge

我有一个主数据数组,它总是由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 个答案:

答案 0 :(得分:1)

假设第一个数组位于$firstArr且第二个数组位于$secondArr并且还假设

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

意味着第二个数组不包含第一个数组中可能不存在的时间戳,然后以下代码在线性时间内执行所需的合并(无O(n ^ 2))

首先在$secondArr内查找$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'];
}