首页 > 解决方案 > PHP:聚合数组

问题描述

假设我有以下 3 个 PHP 数组:

$arr1 = [1,2,3,4]
$arr2 = [5,2,4,1]
$arr3 = [2,1,2,2]

PHP必须将这些数组添加到每个数组的相同索引中的元素的最有效的内置方式是什么。意思是,最终输出如下:

$final = [8,5,9,7]

应该有比做final = [$arr1[0]+$arr2[0]+$arr3[0]..]等更简单的方法。另外,我需要假设数组的数量是可变的,所以像上面这样对数学进行硬编码是不正确的。

标签: php

解决方案


将它们全部设为一个数组并使用 array_sum 和 array_column

$arr1 = [1,2,3,4];
$arr2 = [5,2,4,1];
$arr3 = [2,1,2,2];

$all = [$arr1, $arr2, $arr3];

foreach($all[0] as $key => $v){
    $result[$key] = array_sum(array_column($all, $key));
}

var_dump($result);

输出:

array(4) {
  [0]=>
  int(8)
  [1]=>
  int(5)
  [2]=>
  int(9)
  [3]=>
  int(7)
}

https://3v4l.org/qndQH

此方法仅在所有数组长度相同或第一个数组最长时才有效。


如果您在名称范围内有未知数量的数组,那么您可以循环并使用 isset 查看该数组是否存在,如果存在则将其添加到 $all。

$arr1 = [1,2,3,4,5];
$arr2 = [5,2,4,1];
$arr3 = [2,1,2,2];
$arr4 = [2,1,2,2];
$all = [];

$i=1;
while(isset(${"arr" . $i})){
    $all[] = ${"arr" . $i};
    $i++;
}

foreach($all[0] as $key => $v){
    $result[$key] = array_sum(array_column($all, $key));
}

var_dump($result);


如果您希望它全部超级动态,那么您可以使用上面的代码并添加最长的子数组并在最后一个循环中循环。

$arr1 = [1,2,3,4,5];
$arr2 = [5,2,4,1];
$arr3 = [2,1,2,2];
$arr4 = [2,1,2,2];
$arr5 = [2,1,2,2,6,1,3,2];
$all = [];

// Add all subarrays dynamically and see which is the longest
$i=1;
$count = Null;
while(isset(${"arr" . $i})){
    $all[] = ${"arr" . $i};
    if(count(${"arr" . $i}) > $count){
        $count = count(${"arr" . $i});
        $longkey = $i-1;
    }
    $i++;
}

// Loop the longest subarray
foreach($all[$longkey] as $key => $v){
    $result[$key] = array_sum(array_column($all, $key));
}

var_dump($result);

工作示例:
https ://3v4l.org/lIVGo


推荐阅读