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

时间:2016-02-27 14:52:35

标签: php arrays multidimensional-array

我正在查看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
                 )
           )
        )

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

1 个答案:

答案 0 :(得分:2)

如果您完全确定两个数组具有完全相同的嵌套结构,那么每个级别的每个键都存在于两个数组中,那么您可以这样写:

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);