在多维PHP数组上迭代,在键相同的地方求平均值


Iterating over multidimensional PHP array, averaging value where key is the same

我有一个类似下面的数组,但要大得多:

Array(
    [0] => Array(
        [carrier] => Test Carrier
        [value] => 5
    ),
    [1] => Array(
        [carrier] => New Carrier
        [value] => 18
    ),
    [2] => Array(
        [carrier] = Test Carrier
        [value] => 8
    )
)

实际上,大约有306个阵列具有载波和值的键值对。我想做的是迭代上面的这个数组(它有多个数组,载波=>测试载波),在载波名称相同的地方加上相应的值,然后除以2得到平均值。

因此,对于上面的例子,伪代码中的结果是:

  1. 代码注意到承运人与另一个(即测试承运人)相同

  2. 为13添加8+5,但请记住它有2个carrier = Test Carrier数组,因此它除以2并将值设置为等于该值。如果第三次发生这种情况,它会加2并除以2。目标是获得平均值,如果有15条记录具有相同的运营商名称,则将所有值相加并除以15。

  3. 返回一个数组,该数组具有与上面相同的数据,但没有重复的载波名称,其值等于所有具有相同名称的数组的平均值。

这是我迄今为止所拥有的,但它是不完整的:

    $cars = array(
        'carriers' => array(
        )
    );
    $avgs = array();
    foreach($arr as $new) {
        if(in_array($new['carrier'], $cars['carriers'])) {
            $avgs['value'] = $avgs['value'] + $new['value'] / $cars['count'];
        } else {
            $avgs[] = $new;
            $cars['carriers'] = array(
                'carrier' => $new['carrier'],
                'count'   => 0
            );
        }
    }

如何做到这一点?

<?php 
$data = array(
    array(
        "carrier" => "Test Carrier",
        "value" => 5
    ),
    array(
        "carrier" => "New Carrier",
        "value" => 18
    ),
    array(
        "carrier" => "Test Carrier",
        "value" => 8
    )
);
$results = array();
foreach($data as $row){
    //print_r($row);
    $carrier = $row['carrier'];
    $value = $row['value'];
    if( array_key_exists ( $carrier , $results ) ){
        $results["$carrier"]["value"] =  ( ( $results["$carrier"]["count"] * $results["$carrier"]["value"] ) + $value ) / ( $results["$carrier"]["count"] + 1 );
        $results["$carrier"]["count"] = $results["$carrier"]["count"] + 1;
    }else{
        $results["$carrier"] = array("value"=>$value, "count" => 1);
    }
    //echo "Processing carrier: $carrier value: $value </br>";
}
print_r($results);