我有一个存储在变量$ 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。
谢谢大家。我正处于后端和堆栈溢出之旅的开始,所以如果我犯了错误或者我的问题不够明确,我很抱歉。
答案 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
(当然,我为这个例子编写了表名和列名。)