2016-07-05 93 views
1

我有一个数组存储在变量$ 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. 谢谢大家提前。我在开始我的旅程到后端和stackoverflow,所以如果我犯了一个错误,或者我的问题不够清楚,我很抱歉。要做到这一点

+0

做一个简单的'foreach'并检查每个数组的'[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

一种方法是用array_reduce

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

$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,一个国家的总和,可以在回调中更加整齐使用递增

我觉得还值得一提的是这个操作相当于GROUP BYSUM的SQL,如果你正在使用的阵列是一个SQL查询的结果,它可能会是更好的查询更改为做到这一点,而不是在PHP中,像这样做:

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

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