php 基于相关键合并两个关联数组并对它们的值求和[重复]

nhhxz33t  于 2023-01-08  发布在  PHP
关注(0)|答案(2)|浏览(152)
    • 此问题在此处已有答案**:

Best method for sum two arrays [closed](4个答案)
How to merge two arrays by summing the merged values [duplicate](3个答案)
How to sum all column values in multi-dimensional array?(20个答案)
add the values of two different associative arrays in php . display unique key-values too in the result array [duplicate](5个答案)
Sum 2 or more associative arrays values based on keys [duplicate](4个答案)
昨天关门了。
我正在寻找一种方法来添加两个数组的内容在一起的方式。例如:

$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的预期结果应为"键_1"=〉7,"键_2"=〉9,"键_3"=〉11。
PHP中是否存在这样的函数?(我创建了"add_arrays()"以用于上面的示例。)如果PHP中已经存在这样的函数,我将尽量避免重新发明轮子。

jqjz2hbq

jqjz2hbq1#

您可以在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
)
4bbkushb

4bbkushb2#

这里有两种可能的方法,可以对任意数量的数组进行求和。请阅读行内注解,以了解所做的工作。

对任何现有关键字求和

此方法使用两个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 被省略了,因为它与第一个数组中作为提取列基础的键不匹配,您可以很容易地修改该函数以传入您选择的键并迭代它们。
您还可以使用这种方法代替第一个示例中的“double foreach”来对任何现有键求和,但是首先必须从每个数组中提取键并将它们合并在一起;这将使这里在一个循环中对列求和的简单性失效。

相关问题