获取PHP数组的运行平均值


Getting running average for PHP arrays

我使用一系列MySQL查询来通过Flot库提取按日期存储的计算。计算完成后,回显的材料看起来像这样(使用UNIX时间戳日期):

Item 1: 
        [
            [1159765200000,-117.875], 
            [1159851600000,-117.25], 
            [1159938000000,-120.625], 
            [1160024400000,-122.125], 
            [1160110800000,-118.125], 
            [1160370000000,-121.125], 
            [1160456400000,-123.375], 
            [1160542800000,-115.625], 
            [1160629200000,-117.75], 
            [1160715600000,-112.75], 
            [1160974800000,-125.25], 
            [1161061200000,-135], 
            [1161147600000,-138.375], 
            [1161234000000,-137], 
            [1161320400000,-136.25], 
            [1161579600000,-139.875], 
            [1161666000000,-146.625], 
            [1161752400000,-143.625], 
            [1161838800000,-150.25], 
            [1161925200000,-152.875], 
            [1162188000000,-151.75], 
            [1162274400000,-149.75]
        ]

Item 2: 
        [
            [1104732000000,47.3913043478], 
            [1104818400000,45.5072463768], 
            [1104904800000,45.5797101449], 
            [1104991200000,45.115942029], 
            [1105077600000,44.1739130435], 
            [1105336800000,44.5362318841], 
            [1105423200000,45.9565217391], 
            [1105509600000,45.9420289855], 
            [1105596000000,46.0289855072], 
            [1105682400000,46.4347826087], 
            [1106028000000,48.347826087], 
            [1106114400000,46.8695652174], 
            [1106200800000,46.4927536232], 
            [1106287200000,45.6376811594], 
            [1106546400000,44.3768115942], 
            [1106632800000,44.0579710145], 
            [1106719200000,44.5942028986], 
            [1106805600000,45.0289855072], 
            [1106892000000,45.231884058], 
            [1107151200000,46.1449275362], 
            [1107237600000,46.5942028986], 
            [1107324000000,45.5652173913], 
            [1107410400000,45], 
            [1107496800000,46.2608695652], 
            [1107756000000,45.7391304348], 
            [1107842400000,46.3333333333]
        ]

基本上,我想计算每对中第二个值的平均值,控制日期。换句话说,对于每个数组中匹配的日期,打印日期和每个数组中所有第二个值的平均值,例如:

[普通日期,所有秒值的平均值]

我已经研究了许多数组合并技术,但似乎找不到一个可行的解决方案。

非常感谢您的帮助

您可以构造一个以日期为索引的数组,并在其中放置日期的所有值的列表:

$byDate = array();
foreach($item1 as $row) {
    $date = sprintf('%.0f', $row[0]);
    $byDate[$date][] = $row[1];
}
foreach($item2 as $row) {
    $date = sprintf('%.0f', $row[0]);
    $byDate[$date][] = $row[1];
}

然后你可以很容易地计算每个列表的平均值:

foreach($byDate as $date => $values) {
    $avg = array_sum($values) / count($value);
    printf("avg for %s: %f'n", $date, $avg);
}

或者一次计算所有平均值:

function array_avg($array) {
    return array_sum($array) / count($array);
}
$avgByDate = array_map('array_avg', $byDate);

试试:http://codepad.org/1S1HrYoB

对于您的合并

$merged_array = array();
function merge_by_time()
{
    $passed_arrays = func_get_args();
    $merged_array = array();
    foreach($passed_arrays as $array)
        foreach($array as $value_set){
            $merged_array[$value_set[0]][] = $value_set[1];
        }
    }
    return $merged_array;
}

用法:

$new_array = merge_by_time($array1, $array2, $array3, ...)

那么你将有一个基于时间戳的数组,其中包含了所有相关的数据值。我想你可以从这里得到平均值?


第二种方法

function merge_by_time_and_get_average()
{
    $passed_arrays = func_get_args();
    $merged_array = array();
    foreach($passed_arrays as $array)
        foreach($array as $value_set){
            $merged_array[$value_set[0]]['data'][] = $value_set[1];
            $merged_array[$value_set[0]]['average'] = 0;
            foreach($merged_array[$value_set[0]]['data'] as $data_point){
                $merged_array[$value_set[0]]['average'] += $data_point;
            }
            $merged_array[$value_set[0]]['average'] = $merged_array[$value_set[0]]['average']/count($merged_array[$value_set[0]]['data'])
        }
    }
    return $merged_array;
}

$array[{timestamp}]['data']包含数据点$array[{timestamp}]['average']包含所有数据点的平均值。嵌套的foreach有点混乱和昂贵,但您可以在一个函数调用中处理所有这些。