获得PHP数组的运行平均值

时间:2011-08-23 16:29:28

标签: 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]
        ]

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

[公共日期,所有第二个值的平均值]

我已经查看了许多数组合并技术,但似乎无法找到可行的解决方案。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以构建一个按日期索引的数组,在该数组中放置日期的所有值的列表:

$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

答案 1 :(得分:0)

合并

$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']包含所有数据点的平均值。嵌套的foreachs有点杂乱且昂贵,但您可以在一个函数调用中处理它。