迭代多维PHP数组,平均值,其中键是相同的

时间:2014-09-06 17:53:12

标签: php arrays multidimensional-array

我有一个类似下面的数组,但更大:

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

实际上,大约有306个阵列具有载波和值的键值对。我想要做的是上面的这个数组的迭代(它有多个数组,载体=> Test Carrier)并添加相应的值,其中载体名称相同,然后除以2以达到平均值。

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

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

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

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

  4. 这是我迄今为止所做的,但它不完整:

        $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
                );
    
            }
    
        }
    

    如何做到这一点?

1 个答案:

答案 0 :(得分: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);