[英]Sum array values based on key intersection
我有一个循环,其中我同时将值推入两个数组中,因此得到了两个这样的数组:
$array1 = [ 1 , 1 , 1 , 2 , 2 , 3 ];
$array2 = [ 2 , 4 , 5 , 2 , 1 , 5 ];
我如何从$array2
获得每个唯一$array1
的总和,即1,2,3
,该数字的相应键。
例; 对于$array1
的值1
,我们得到了键0, 1, 2
。 现在,我想对$array2
中具有这些键的值求和,得出2 + 4 + 5 = 11
。
我会写一个循环来获取$array1
所有具有1
的索引,然后使用这些索引从$array2
获取所有值,以此类推吗?
您可以使用array_map
传递功能来使两个数组起作用,并使用对每个总计的空数组的引用:
$total = array_fill_keys( array_unique($array1), 0 );
array_map
(
function( $a, $b ) use( &$total )
{
$total[$a] += $b;
},
$array1,
$array2
);
print_r( $total );
输出:
Array
(
[1] => 11
[2] => 3
[3] => 5
)
array_map
接受多个数组,并同步传递其每个项目,因此您可以使用与$array1
值相同的键将每个$array2
值求和到$total
元素。
请注意,我们仅使用array_fill_keys
初始化$total
以避免在创建新的$total
元素时发出通知。
如果您已经将值推入$array1
且同时将值推入$array1
$array2
,为什么不简单地创建第三个数组并将第二个数组的值推入相应元素的和中,并使用第一个数组中的键?!
因此,您不必调用任何其他函数即可执行此操作,并且可以在循环本身中直接进行操作。
伪代码:
<?php
$sum = [];
loop {
$arrayOne[] = $valueOne;
$arrayTwo[] = $valueTwo;
if(!isset($sum[$valueOne])) $sum[$valueOne] = 0; $sum[$valueOne] += $valueTwo;
}
print_r($sum);
?>
因此,最终得到一个具有如下模式的数组:
Array (
[unique value from array one] => sum
)
首先,我们只需通过使用array_flip()
将其翻转即可从$array1
获得所有唯一值。 由于您不能有重复的键,因此我们最终将所有唯一值作为$uniqueValues
键。 我们还使用一个空数组初始化$sum
,在其中将每个值的总和放入其中。
现在,我们遍历所有唯一值,并从$array1
获取所有键,这些键通过array_keys()
具有特定的值。
然后,我们使用第二个数组中的所有键array_intersect_key()
与array_intersect_key()
获得所有值。 注意,由于我们按键进行交集,因此必须翻转键数组,以便将键作为数组的键。
之后,我们将$array2
中的所有值都放在一个数组中,该值对应于当前迭代中第一个数组的值。 我们可以将其与array_sum()
求和,然后将其保存在$sum
。
<?php
$array1 = [ 1 , 1 , 1 , 2 , 2 , 3 ];
$array2 = [ 2 , 4 , 5 , 2 , 1 , 5 ];
$sum = [];
$uniqueValues = array_flip($array1);
foreach($uniqueValues as $v => $notNeeded){
$keys = array_keys($array1, $v);
$sum[$v] = array_sum(array_intersect_key($array2, array_flip($keys)));
}
print_r($sum);
?>
输出:
Array (
[1] => 11
[2] => 3
[3] => 5
)
尝试对array_reduce
使用功能性方法:
<?php
$array1 = [ 1 , 1 , 1 , 2 , 2 , 3 ];
$array2 = [ 2 , 4 , 5 , 2 , 1 , 5 ];
$newArray = array_reduce($array1, function($carry, $item) use($array2) {
$item2 = $array2[$carry['index']];
$carry[$item] = empty($carry[$item]) ? $item2 : $carry[$item] + $item2;
$carry['index'] = $carry['index'] + 1;
return $carry;
}, ['index' => 0]);
unset($newArray['index']);
var_dump($newArray);
输出将是:
array(3) {
[1]=>
int(11)
[2]=>
int(3)
[3]=>
int(5)
}
解有序序列(例如, 1 , 1 , 1 , 2 , 2 , 3
),使用array_count_values
, array_walk
和array_sum
功能:
$array1 = [ 1 , 1 , 1 , 2 , 2 , 3 ];
$array2 = [ 2 , 4 , 5 , 2 , 1 , 5 ];
$counts = array_count_values($array1);
$offset = 0;
$sums = [];
array_walk($counts, function($v, $k) use($counts, &$sums, $array2, &$offset){
$offset += isset($counts[$k-1])? $counts[$k-1] : 0;
$sums[$k] = array_sum(array_slice($array2, $offset, $v));
});
print_r($sums);
输出:
Array
(
[1] => 11
[2] => 3
[3] => 5
)
http://php.net/manual/zh/function.array-count-values.php
http://php.net/manual/zh/function.array-walk.php
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.