为数组中相同的项创建值的总和

时间:2016-07-05 20:06:10

标签: php arrays

我有一个存储在变量$ data中的数组。该数组的第一行包含国家,第二行包含值。问题是一个国家可能会多次插入数组但具有不同的值。当发生这种情况时,我需要一个解决方案来显示国家和该数组中所有条目的总和。例如

$data(array): 
data=>
    [0]=>
        array(1447) {
          [1]=>
          array(3) {
            [0]=>
            string(11) "France"
            [1]=>
            string(1) "11"
          }
          [2]=>
          array(3) {
            [0]=>
            string(7) "Italy"
            [1]=>
            string(1) "28"
          }
          [3]=>
          array(3) {
            [0]=>
            string(6) "France"
            [1]=>
            string(1) "50"
          }
          [4]=>
          array(3) {
            [0]=>
            string(6) "France"
            [1]=>
            string(1) "22"
          }
          [5]=>
          array(3) {
            [0]=>
            string(6) "Germany"
            [1]=>
            string(1) "1"
          }
          [6]=>
          array(3) {
            [0]=>
            string(6) "Romania"
            [1]=>
            string(1) "5"
          }

在这种情况下,我应该显示:法国83,意大利28,德国1,罗马尼亚5.因此,由于法国有三个条目,我需要显示所有条目的总和...如$data->data[0][1][1] + $data->data[0][3][1] + $data->data[0][4][1]的总和,这就是我称之为价值观的方式。这转化为:11 + 50 + 22 = 83。 谢谢大家。我正处于后端和堆栈溢出之旅的开始,所以如果我犯了错误或者我的问题不够明确,我很抱歉。

2 个答案:

答案 0 :(得分:2)

// array to store sums
$sums = array(); 
// iterate over each element of $data[0]
foreach ($data[0] as $item) {
    // get country name
    $country = $item[0];
    // if there's no such country name key in $sums - make it with value 0
    if (!isset($sums[$country])) {
        $sums[$country] = 0;
    }

    // add value to current country key
    $sums[$country] += $item[1];
}

答案 1 :(得分:1)

执行此操作的一种方法是使用array_reduce

$result = array_reduce($data[0], function($sums, $x) {
    $sums[$x[0]] = (isset($sums[$x[0]]) ? $sums[$x[0]] : 0) +$x[1];
    return $sums;
});

如果您使用PHP 7,则可以使用以下方式更准确地在回调中递增国家/地区的总和:

$sums[$x[0]] = ($sums[$x[0]] ?? 0) + $x[1];

我认为值得一提的是,在SQL中,这个操作等同于GROUP BY SUM,如果您正在使用的数组是SQL查询的结果,更改查询以执行此操作而不是在PHP中执行此操作可能会更好,例如:

SELECT country_name, SUM(name_of_number_column) AS country_total
FROM your_country_table GROUP BY country_name

(当然,我为这个例子编写了表名和列名。)