2016-07-05 31 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 

(當然,我編寫了這個例子的表格和列名。)