【问题标题】:Adding arrays with the same keys in PHP在 PHP 中添加具有相同键的数组
【发布时间】:2022-01-14 16:37:30
【问题描述】:

我正在寻找一种以键方式将两个数组的内容相加的方法。示例:

$first_array = array("key_1" => 2, "key_2" => 3, "key_3" => 4);
$second_array = array("key_1" => 5, "key_2" => 6, "key_3" => 7);
$third_array = add_arrays($first_array, $second_array);

$third_array 的预期结果应该是 "key_1" => 7, "key_2" => 9, "key_3" => 11。

PHP 中是否存在执行此操作的现有函数? (出于上述示例的目的,我已经编写了“add_arrays()”。)如果 PHP 中已经存在这种情况,我会尽量不重新发明轮子。

【问题讨论】:

  • 你看手册了吗。有一个Array Function的页面会帮你回答你自己的问题,需要一点努力和时间
  • 如果你想尝试一下,一个简单的循环应该可以解决问题
  • RiggsFolly 我确实查看了手册,但发现许多功能似乎无法满足我的要求。也许如果你知道一个,你可以指点我。我很欣赏循环可以解决问题,但我想知道是否已经存在具有所需功能的内置函数。

标签: php arrays key add


【解决方案1】:

您可以在PHP Manual, Array Functions section 中使用array_walk()

当我传递对第一个数组项 &$a1_item 的引用时,这将使用总和更新 first_array。

$first_array = array("key_1" => 2, "key_2" => 3, "key_3" => 4);
$second_array = array("key_1" => 5, "key_2" => 6, "key_3" => 7);


function add(&$a1_item, $a1_key, $second_array) 
{
    $a1_item += $second_array[$a1_key];
}

array_walk($first_array, 'add', $second_array);
print_r($first_array);

结果

Array
(
    [key_1] => 7
    [key_2] => 9
    [key_3] => 11
)

或者你可以简单地将第一个数组复制到一个新数组中,然后使用它

$first_array = array("key_1" => 2, "key_2" => 3, "key_3" => 4);
$second_array = array("key_1" => 5, "key_2" => 6, "key_3" => 7);

$new_array = array_combine(array_keys($first_array), $first_array);
function add(&$a1_item, $a1_key, $second_array) 
{
    $a1_item += $second_array[$a1_key];
}

array_walk($new_array, 'add', $second_array);
print_r($new_array);

结果

Array
(
    [key_1] => 7
    [key_2] => 9
    [key_3] => 11
)

【讨论】:

  • 我必须在没有 array_walk 的情况下这样做,因为我需要它对 $first_array 没有破坏性。
  • 如果我的问题的答案是“不,那不是内置函数之一”,我会怎么做。
  • 所以复制array1然后array_walk似乎是一个很好的解决方案
【解决方案2】:

这里有两种可能的方法,可用于对任意数量的数组求和。请阅读内联 cmets 以更深入地了解正在执行的操作。

对所有现有密钥求和

此方法使用两个foreach 循环,将在任何数组中找到的任何键的值相加:

// Tuck arrays into a parent array to keep iteration simple
$arrays['first'] = array("key_1" => 2, "key_2" => 3, "key_3" => 4);
$arrays['second'] = array("key_1" => 5, "key_2" => 6, "key_3" => 7);
$arrays['third'] = array("key_1" => 1, "key_3" => 7, "key_7" => 2);

// Function: Sum Arrays By Key
function sum_arrays_by_key(array $arrays) {
    $sums = [];

    // Iterate each array:
    foreach($arrays as $arr_vals) {

        // Iterate their values:
        foreach($arr_vals as $key => $val) {

            // Initialize the summary key:
            $sums[$key] ??= 0;

            // Add up the value:
            $sums[$key] += $val;
        }
    }
    return $sums;
}

$sums = sum_arrays_by_key($arrays);

print_r($sums);

结果:

Array
(
    [key_1] => 8
    [key_2] => 9
    [key_3] => 18
    [key_7] => 2
)

回顾:这将来自任意数量数组的匹配键的值求和,并且不要求每个数组具有相同的键。 (第三个数组没有key_2,有key_7,其他的都没有。)

按第一个数组的键求和

这种方法使用array_sum()array_column() 并通过迭代第一个数组中的键来对列求和:

// Function: Sum Arrays Match Keys
function sum_arrays_match_keys(array $arrays) {
    $sums = [];

    // Get keys from the first array:
    $keys = array_keys(current($arrays));
    
    // Iterate keys:
    foreach($keys as $key) {

        // Sum up the columns:
        $sums[$key] = array_sum(array_column($arrays, $key));
    }
    return $sums;
}

$sums = sum_arrays_match_keys($arrays);

print_r($sums);

结果:

Array
(
    [key_1] => 8
    [key_2] => 9
    [key_3] => 18
)

您会注意到第三个示例数组中的 key_7 被省略了,因为它与作为获取列的基础的第一个数组的键不匹配。您可以轻松地修改函数以传递您选择的键并对其进行迭代。

您也可以使用这种方法代替第一个样本的“双 foreach”来对任何现有键求和,但是您首先必须从每个数组中提取键并将它们合并在一起;这将破坏在这里在一个循环中总结列的简单性。

【讨论】:

  • TYVM。会投票,但没有代表
  • 万物皆宜。希望它可以帮助您收集阵列。
  • 对,要明确一点:显然也可以使用 sum_arrays_by_key([ $first, $second, $third ]) 等调用函数,但是出于测试目的,我发现能够将可迭代对象添加到“主机”数组中很方便,而无需每次我添加或删除一个项目时都会尝试调用函数。
猜你喜欢
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多