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


How to group keys and values of an (sub)array and sum its values using PHP?

>我有以下数组

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

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

我对所有

冗长而复杂的答案感到惊讶。但是,需要初始 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
)
为您提供

的解决方案在这里:

法典:

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

包括输出

只需将代码复制到您喜欢的文本编辑器中,即可确保它完美运行。

    $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>';
$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