如何根据第 2 级键对 2 维数组的第 2 级值求和?
How to sum the 2nd level values of a 2-dim array based on the 2nd level keys?
我有一个这样的多维数组:
array(
0 => array(
11 => 18.000,
14 => 25.100,
15 => 5.000,
16 => 8.000,
19 => 21.600'
),
1 => array(
11 => 9.100,
12 => 2.700,
14 => 2.300,
15 => 18.800,
16 => 9.500,
17 => 6.900,
19 => 9.400'
),
2 => array(
14 => 5.700
),
3 => array(
17 => 2.800,
20 => 6.000
),
4 => array(
24 => 5.000,
25 => 6.000,
26 => 2.7
),
5 => array(
16 => 2.200
),
6 => array(
14 => 13.000,
15 => 2.000,
16 => 4.300,
19 => 6.000
),
7 => array(
32 => 5.000,
36 => 18.500
)
)
二级数组长度不一。但是我想获取具有相似键的元素的值并将它们加在一起以获得总计。
例如,如果数组名为 $multi_dime
。我想要 $multi_dime[0][11]
将其添加到 $multi_dime[1][11]
等等。
如果键不存在于以下数组中。它应该只添加 0
或忽略它。代码应该继续对二级数组中的所有键执行此操作,并将结果存储在另一个数组中,如:
array( 11 => 27.1, 14 => 46.1, ...)
我怎样才能做到这一点?数组总是二维的,但可以是任意长度,二级数组也可以是任意长度。
只需使用 foreach 或 for 循环。这就是您处理数组的方式,无论是一维、二维、三维、四维还是两百维。由于您将有多个总和,因此将总和变量设为一个数组。在循环外声明它,因为当循环完成时您将需要它。
$sums = array();
foreach($multi_dime as $vals)
{
foreach($vals as $key=>$val)
{
// Now we are looping through all values in the second dimension.
// If the key is not in the sums array, make it.
if(!isset($sums[$key])) $sums[$key]=0;
// We add this sum to the key now.
$sums[$key]+= $val;
}
}
ksort($sums); // Just in case you want the keys in order.
print_r($sums); // See all the sums.
这是一种效率较低(我假设)的方法,用于计算所有特定于键的列的总和。唯一的区别是我的方法中没有迭代条件,但它确实调用了 "heavier" 函数。
代码:(Demo)
$result=[];
foreach($array as $subarray){
$subarray=array_diff_key($subarray,$result); // deny iteration of previously summed subarray keys
foreach($subarray as $k=>$v){
$result[$k]=array_sum(array_column($array,$k)); // sum the whole array's column
}
}
var_export($result);
如果这是我的项目,我会编写与 kainaw 非常相似的代码(但不完全相同)。我不喜欢将初始值声明为 0
然后在同一次迭代中添加到 0
——这是不必要的双重处理。
代码:(Demo)
foreach($array as $subarray){
foreach($subarray as $k=>$v){
if(!isset($result[$k])){
$result[$k]=$v;
}else{
$result[$k]+=$v;
}
}
}
var_export($result);
我有一个这样的多维数组:
array(
0 => array(
11 => 18.000,
14 => 25.100,
15 => 5.000,
16 => 8.000,
19 => 21.600'
),
1 => array(
11 => 9.100,
12 => 2.700,
14 => 2.300,
15 => 18.800,
16 => 9.500,
17 => 6.900,
19 => 9.400'
),
2 => array(
14 => 5.700
),
3 => array(
17 => 2.800,
20 => 6.000
),
4 => array(
24 => 5.000,
25 => 6.000,
26 => 2.7
),
5 => array(
16 => 2.200
),
6 => array(
14 => 13.000,
15 => 2.000,
16 => 4.300,
19 => 6.000
),
7 => array(
32 => 5.000,
36 => 18.500
)
)
二级数组长度不一。但是我想获取具有相似键的元素的值并将它们加在一起以获得总计。
例如,如果数组名为 $multi_dime
。我想要 $multi_dime[0][11]
将其添加到 $multi_dime[1][11]
等等。
如果键不存在于以下数组中。它应该只添加 0
或忽略它。代码应该继续对二级数组中的所有键执行此操作,并将结果存储在另一个数组中,如:
array( 11 => 27.1, 14 => 46.1, ...)
我怎样才能做到这一点?数组总是二维的,但可以是任意长度,二级数组也可以是任意长度。
只需使用 foreach 或 for 循环。这就是您处理数组的方式,无论是一维、二维、三维、四维还是两百维。由于您将有多个总和,因此将总和变量设为一个数组。在循环外声明它,因为当循环完成时您将需要它。
$sums = array();
foreach($multi_dime as $vals)
{
foreach($vals as $key=>$val)
{
// Now we are looping through all values in the second dimension.
// If the key is not in the sums array, make it.
if(!isset($sums[$key])) $sums[$key]=0;
// We add this sum to the key now.
$sums[$key]+= $val;
}
}
ksort($sums); // Just in case you want the keys in order.
print_r($sums); // See all the sums.
这是一种效率较低(我假设)的方法,用于计算所有特定于键的列的总和。唯一的区别是我的方法中没有迭代条件,但它确实调用了 "heavier" 函数。
代码:(Demo)
$result=[];
foreach($array as $subarray){
$subarray=array_diff_key($subarray,$result); // deny iteration of previously summed subarray keys
foreach($subarray as $k=>$v){
$result[$k]=array_sum(array_column($array,$k)); // sum the whole array's column
}
}
var_export($result);
如果这是我的项目,我会编写与 kainaw 非常相似的代码(但不完全相同)。我不喜欢将初始值声明为 0
然后在同一次迭代中添加到 0
——这是不必要的双重处理。
代码:(Demo)
foreach($array as $subarray){
foreach($subarray as $k=>$v){
if(!isset($result[$k])){
$result[$k]=$v;
}else{
$result[$k]+=$v;
}
}
}
var_export($result);