如何对(子)数组的键和值进行分组并使用PHP对其值求和?

时间:2014-09-11 14:10:27

标签: php arrays multidimensional-array grouping

我有以下数组

Array (
    [0] => Array
        (
            [0] => ALFA
            [1] => 213
        )

    [1] => Array
        (
            [0] => ALFA
            [1] => 151
        )

    [2] => Array
        (
            [0] => ALFA
            [1] => 197
        )

    [3] => Array
        (
            [0] => BETA
            [1] => 167
        )

    [4] => Array
        (
            [0] => ZETA
            [1] => 254
        )

    [5] => Array
        (
            [0] => GAMA
            [1] => 138
        )

    [6] => Array
        (
            [0] => GAMA
            [1] => 213
        )

)

我想将子阵列的键[0]分组,以便我可以看到它有多少相等的键。

类似的东西:

ALFA => 3
BETA => 1
EPSI => 1
GAMA => 2

我尝试使用array_count_values,但没有成功。

foreach ($array as $value) {
    echo '<pre>';
    print_r(array_count_values($value));
    echo '</pre>';
}

我们有以下结果:

Array
(
    [ALFA] => 1
    [213] => 1
)

Array
(
    [ALFA] => 1
    [151] => 1
)
...
Array
(
    [GAMA] => 1
    [213] => 1
)

之后我想总结每组的价值观。

ALFA => 213 + 151 + 197
BETA => 167
ZETA => 254
GAMA => 138 + 213

我认为,当我们解决问题的第一部分时,第二部分将更容易使用相同的方法。

最终目的是将值的总和除以每个键组的出现次数,因此我们可以得到平均值:

ALFA => (213+151+197) / 3 = 187
BETA => 167
ZETA => 254
GAMA => (138+213) / 2 = 175,5

这不是主要问题,但正如我所说,我一直坚持解决方案的开头,并希望得到任何帮助。

5 个答案:

答案 0 :(得分:2)

我对所有漫长而复杂的答案感到惊讶。但是,需要将数据建模为可管理的初始foreach。之后你只需要做一个非常简单的array_walk。

<?php
$result = array();
foreach ($array as $el) {
    if (!array_key_exists($el[0], $result)) {
        $result[$el[0]] = array();
    }
    $result[$el[0]][] = $el[1];
}
array_walk($result, create_function('&$v,$k', '$v = array_sum($v) / count($v);'));
?>

结果:

Array
(
    [ALFA] => 187
    [BETA] => 167
    [ZETA] => 254
    [GAMA] => 175.5
)

答案 1 :(得分:0)

$sort = array();
foreach ($array as $value) {
  $sort[$value[0]][] = $value[1];
}

然后计算每个键有多少个键

$keys = array();
foreach($sort as $k => $v) {
  $keys[$k] = count($v);
}

然后计算金额

$sum = array();
$average = array();
foreach($sort as $k => $v) {
  $amount = 0;
  foreach($v as $val) {
    $amount += $val;
  }
  $sum[$k] = $amount; 
  $average[$k] = $amount / $keys[$k];
}

但是,如果你想要一个数组中的所有细节:

$final = array();
foreach ($array as $value) {
    $final[$value[0]]["values"][] = $value[1];
}
foreach($final as $k => $v) {
    $final[$k]["amount"] = count($v['values']);
    $amount = 0;
    foreach($v['values'] as $val) {
        $amount += $val;
    }
    $final[$k]["sum"] = $amount; 
    $final[$k]["average"] = $amount / $final[$k]["amount"];
}

示例:http://jdl-enterprises.co.uk/sof/25789697.php

包括输出

答案 2 :(得分:0)

你的解决方案就在这里:

代码:

$input = [

    ['alfa', 123],
    ['alfa', 223],
    ['alfa', 122],
    ['alfa', 554],
    ['alfa', 34],
    ['dalfa', 123],
    ['halfa', 223],
    ['dalfa', 122],
    ['halfa', 554],
    ['ralfa', 34]
];

$result = [];

foreach ($input as $node) {
    if (isset($result[$node[0]])) {
        $result[$node[0]] = ['sum' => $result[$node[0]]['sum'] + $node[1], 'count' => $result[$node[0]]['count'] + 1];
    } else {
        $result[$node[0]] = ['sum' => $node[1], 'count' => 1];
    }
}

print_r($result);

foreach ($result as $key => &$data) {
    $data = $data['sum'] / $data['count'];
}

print_r($result);

输出:

Array
(
    [alfa] => Array
        (
            [sum] => 1056
            [count] => 5
        )

    [dalfa] => Array
        (
            [sum] => 245
            [count] => 2
        )

    [halfa] => Array
        (
            [sum] => 777
            [count] => 2
        )

    [ralfa] => Array
        (
            [sum] => 34
            [count] => 1
        )

)
Array
(
    [alfa] => 211.2
    [dalfa] => 122.5
    [halfa] => 388.5
    [ralfa] => 34
)

答案 3 :(得分:0)

只需将代码复制到您喜欢的文本编辑器,确保它完美无缺。

    $items = [
        ['ALFA',213],
        ['ALFA',151],
        ['ALFA',197],
        ['BETA',167],
        ['ZETA',254],
        ['GAMA',138],
        ['GAMA',213]
    ];

    echo '<pre>' . print_r($items,true) . '</pre>';

    $result;

    foreach ($items as $value) {
        # code...
        if (isset($result[$value[0]])) {
            $sum = $result[$value[0]]['sum'] + $value[1];
            $count =  $result[$value[0]]['count'] + 1;
            $result[$value[0]] = ['sum' => $sum  , 'count' => $count, 'divided' => ($sum / $count)];
        } else {
            $result[$value[0]] = ['sum' => $value[1] , 'count' => 1 , 'divided' => ($value[1] / 1) ];
        }
    }

    echo '<pre>' . print_r($result,true) . '</pre>';

答案 4 :(得分:0)

$myArray = [
    ["ALFA",213],
    ["ALFA",151],
    ["ALFA",197],
    ["BETA",167],
    ["ZETA",254],
    ["GAMA",138],
    ["GAMA",213]
];
$a1 = array(); //TEMPORARY ARRAY FOR KEEPING COUNT & TOTAL VALUES
$res = array(); //ARRAY USED TO KEEP RESULT
foreach($myArray as $val)
{
    //AVOID PESKY NOTICES FOR UNDEFINED INDEXES
    if ( !array_key_exists($val[0],$a1) ) {
        $a1[$val[0]] = array("count" => 0,"total" => 0);
        $res[$val[0]] = 0;
    }
    //INCREMENT THE COUNT OF INSTANCES OF THIS KEY
    $a1[$val[0]]["count"]++;
    //INCREMENT THE TOTAL VALUE OF INSTANCES OF THIS KEY
    $a1[$val[0]]["total"]+=$val[1];
    // UPDATE RESULT ARRAY
    $res[$val[0]] = $a1[$val[0]]["total"] / $a1[$val[0]]["count"];
}

print_r($res);

应该导致:

Array
(
    [ALFA] => 187
    [BETA] => 167
    [ZETA] => 254
    [GAMA] => 175.5
)

示例:http://phpfiddle.org/lite/code/a7nt-5svf

相关问题