在 php 中获取具有相同键的两个或多个多维数组的元素总和


Getting sum of elements of two or more multidimensional arrays with same key in php

我正在 php.net 中查看一些函数,例如array_mergearray_combine,但我仍然不知道如何实现我对数组的假设。 我的假设数组如下所示。

$data1 = array(
       [0]=>array(
           [2]=>array(
                  [subject1]=>30
                  [subject2]=>50
             )
       )
      [1]=>array(
           [3]=>array(
                  [subject1]=>30
                  [subject2]=>50
             )
       )
    )
$data2 = array(
       [0]=>array(
           [2]=>array(
                  [subject1]=>20
                  [subject2]=>70
             )
       )
      [1]=>array(
           [3]=>array(
                  [subject1]=>30
                  [subject2]=>40
             )
       )
    )

如何将上述 2 个(可以是更多数组)数组放入一个数组中,如下所示的结构:

$datamerge = array(
           [0]=>array(
               [2]=>array(
                      [subject1]=>50
                      [subject2]=>120
                 )
           )
          [1]=>array(
               [3]=>array(
                      [subject1]=>60
                      [subject2]=>90
                 )
           )
        )

请帮助我。这是我的项目,对我来说非常重要。

当你绝对确定两个数组具有完全相同的嵌套结构,以便每个级别的每个键都存在于两个数组中时,那么你可以这样写:

function array_sum_recursive ($data1, $data2) {
    if (!is_array($data1)) {
        return $data1 + $data2;
    }
    foreach ($data1 as $key => $value) {
        $result[$key] = array_sum_recursive($data1[$key], $data2[$key]); 
    }
    return $result;
}
$result = array_sum_recursive($data1, $data2);
var_export($result);

包含您提供的数据的输出将是:

array (
  0 => 
  array (
    2 => 
    array (
      'subject1' => 50,
      'subject2' => 120,
    ),
  ),
  1 => 
  array (
    3 => 
    array (
      'subject1' => 60,
      'subject2' => 90,
    ),
  ),
)

但是,让函数处理可能不太对应的输入数组会更安全。它使函数更长,因为必须完成所有测试:

function array_sum_recursive($data1, $data2) {
    if (!is_array($data1) && !is_array($data2)) {
        return $data1 + $data2;
    }
    // deepest array gets precedence
    if (!is_array($data2)) {
        return $data1;
    }
    if (!is_array($data1)) {
        return $data2;
    }
    $keys = array_unique(array_merge(array_keys($data1), array_keys($data2)));
    foreach ($keys as $key) {
        if (isset($data1[$key]) && isset($data2[$key])) {
            $result[$key] = array_sum_recursive($data1[$key], $data2[$key]); 
        } else if (isset($data1[$key])) {
            $result[$key] = $data1[$key];
        } else {
            $result[$key] = $data2[$key];
        }
    }
    return $result;
}

两个以上的阵列

如果您需要添加两个以上的数组,您可以将下一个数组逐步相加到前一个总和的结果中,如下所示:

$result = array_sum_recursive($data1, $data2);
$result = array_sum_recursive($result, $data3);
$result = array_sum_recursive($result, $data4);
// etc.

您甚至可以为此编写一个函数,该函数需要可变数量的参数(参见func_get_args()):

function array_sum_recursive_all() {
    $result = array();
    foreach(func_get_args() as $data) {
        $result = array_sum_recursive($result, $data);
    }
    return $result;
}

然后你可以写:

$result = array_sum_recursive_all($data1, $data2, $data3, $data4);