Php 基于键交点的数组值求和
我有一个循环,在这个循环中,我同时将值推送到两个数组中,所以我得到两个数组,如下所示:Php 基于键交点的数组值求和,php,jquery,arrays,Php,Jquery,Arrays,我有一个循环,在这个循环中,我同时将值推送到两个数组中,所以我得到两个数组,如下所示: $array1 = [ 1 , 1 , 1 , 2 , 2 , 3 ]; $array2 = [ 2 , 4 , 5 , 2 , 1 , 5 ]; Array ( [unique value from array one] => sum ) 如何从$array2中获取该数字对应键的$array1的每个唯一数字的总和,即1,2,3 榜样;对于$array1的值1,我们得到了键0、1、2。现在,
$array1 = [ 1 , 1 , 1 , 2 , 2 , 3 ];
$array2 = [ 2 , 4 , 5 , 2 , 1 , 5 ];
Array (
[unique value from array one] => sum
)
如何从$array2
中获取该数字对应键的$array1
的每个唯一数字的总和,即1,2,3
榜样;对于$array1
的值1
,我们得到了键0、1、2
。现在,我想总结一下$array2
中包含这些键的值,结果是2+4+5=11
我是否会编写一个循环来获取
$array1
中包含1
的所有索引,然后使用这些索引从$array2
获取所有值,依此类推 如果您已经将值推送到$array1
中,同时也推送到$array2
中,为什么不创建第三个数组,并使用第一个数组中的键将第二个数组的值推送到相应元素的和中呢
因此,您不必调用任何其他函数来执行此操作,您可以在循环本身中正确地执行此操作
伪代码:
<?php
$sum = [];
loop {
$arrayOne[] = $valueOne;
$arrayTwo[] = $valueTwo;
if(!isset($sum[$valueOne]))
$sum[$valueOne] = 0;
$sum[$valueOne] += $valueTwo;
}
print_r($sum);
?>
尝试将功能性方法用于:
使用
array\u count\u value
、array\u walk
和array\u sum
函数解决有序序列(如1,1,2,2,3
):
$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
)
解释 首先,只需用鼠标翻转,
$array1
中的所有唯一值。由于不能有重复的键,因此我们最终将所有唯一值作为$uniqueValues
中的键。我们还使用空数组初始化$sum
,将每个值的和放入其中
现在,我们循环遍历所有唯一值,并从$array1
中获取所有键,这些键具有特定的值
然后,我们从第二个数组中获取所有值,这些值包含我们使用的键。请注意,由于我们按关键点进行相交,因此必须翻转关键点数组,以便将关键点作为数组的关键点
之后,我们在一个数组中有来自$array2
的所有值,该数组对应于当前迭代中第一个数组的值。我们可以把它和一起求和并保存在$sum
中
密码
您可以使用
array\u 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
(
[1] => 11
[2] => 3
[3] => 5
)
array\u map
接受多个数组,并同步传递其每个项目,因此您可以使用与$array1
值相同的键将每个$array2
值相加到$total
元素
请注意,我们使用
数组填充键初始化$total
,只是为了避免在创建新的$total
元素时发出通知。最后一段:是的,这就是您可以做的。试着这样做,如果你被困在代码后,我们会帮助你完成它。在你的情况下,$array1
是否有可能有随机顺序的值,比如[1,1,1,3,2,3,2]
?让我们假设它们是有序的。@gavgri如果你的答案是一个好的建议,如果OP同时将值推入两个数组,那么他可以立即将这些数字相加。是的,我同时将它们推入,建议是什么?答案似乎已被删除。谢谢您的回答。如果上面的答案不行,我也会试试你的。谢谢,我也会试试这个解决方案。。这里介绍了这么多很棒的方法。很好的回答和解释!也像array\u fill\u keys()。但我不明白你为什么用@
?我的意思是你已经初始化了数组,如果这两个数组的数量不相等,那么它就会变成:NULL->0
@Rizier123我忘了删除它。这是我在使用array\u fill\u keys()
之前的第一个解决方案。像往常一样,抓得好!谢谢。@scott.schaffer不客气。Rizier123的答案更精彩。@fusion3k很好,尽管我的代码比你的代码稍快,而且只要你不执行这些操作数千次,就不会引起注意。我认为,由于您的解决方案使用较少的代码,因此更易于阅读/理解。但真正应该被接受的答案是可悲的被删除了,我正试图找出原因:让它不被删除
Array (
[1] => 11
[2] => 3
[3] => 5
)
$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
)