合并两个“m-Y”键数组并对相交键的值求和,然后按年排序,然后按月排序

问题描述 投票:0回答:9

我想合并两个关联数组并对它们的值求和,其中两个数组具有相同的键。

$first = [
    '01-1970' => 0.00,
    '03-2019' => 4350.00,
    '05-2019' => 150.00,
    '06-2019' => 50.00,
];

$second = [
    '03-2019' => 0.00,
    '04-2019' => 0.00,
    '06-2019' => 34.83,
];

想要的结果:

[
    '01-1970' => 0.00,
    '03-2019' => 4350,
    '04-2019' => 0.00,
    '05-2019' => 150.00,
    '06-2019' => 84.83,
]
php arrays merge sum associative-array
9个回答
3
投票

您可以使用

array_keys
从两个数组中获取唯一值,然后循环遍历某些键

$r = [];
$keys = array_keys($a1+$a2);
foreach($keys as $v){
  $r[$v] = (empty($a1[$v]) ? 0 : $a1[$v]) + (empty($a2[$v]) ? 0 : $a2[$v]);
}

工作演示


3
投票

最好的办法是单独循环数组,然后将值汇总到结果数组中。我们可以创建一个包含这两个数组的新数组,以稍微缩短我们的代码(看看我们如何将

[$first, $second]
定义为第一个循环)。

这消除了混合长度的任何问题,并保持数组中的所有键和值完好无损。

$result = [];
// Loop over our two arrays, here called $first and $second
foreach ([$first, $second] as $a) {
    // Loop over the values in each array
    foreach ($a as $k=>$v) {
        // If the index is new to the $result array, define it to be zero (to avoid undefined index notices) 
        if (!isset($result[$k]))
            $result[$k] = 0;

        // Sum up the value!
        $result[$k] += $v;
    }
}
print_r($result);

2
投票

你可以利用我做的一个功能:

<?php
    function array_sum_multi($arrayOne, $arrayTwo)
    {
        # get rid of keys
        $valuesOne = array_values($arrayOne);
        $valuesTwo = array_values($arrayTwo);

        //create return array
        $output = [];

        # loop that shizzle
        for ($i = 0; $i < count($valuesOne); $i++)
        {
            $output[$i] = $valuesOne[$i] + (!empty($valuesTwo[$i]) ? $valuesTwo[$i] : 0);
        }

        return $output;
    }

    $result = array_sum_multi([0.00, 4350.00, 150.00, 50.00], [0.00, 0.00, 34.83]);

    # then for your keys:
    $result = array_combine(array_keys($yourFirstArray), $result);

    echo '<pre>'. print_r($result, 1) .'</pre>';

1
投票
$result = $first_array; // just copy array into result

// scan second array
foreach ($second_array as $k => $v) {
   // if key already exists, then add, else just set
   $result[$k] = isset($result[$k]) ? ($result[$k] + $v) : $v;
}

// done
print_r($result);

0
投票

实现它的一个简单方法是循环遍历每个数组,并将其添加到具有相同键的公共数组中。

如果第一个数组小于第二个数组,或者第二个数组中的某些元素不存在于第一个数组中,则仅循环一个数组将导致缺少一些元素。

所以让我们循环遍历它们并将其添加到总和中。

$sum = [];

foreach($firstArray as $key => $value){
  $sum[$key] = $value + (isset($sum[$key]) ? $sum[$key] : 0.0);
}
foreach($secondArray as $key => $value){
  $sum[$key] = $value + (isset($sum[$key]) ? $sum[$key] : 0.0);
}

print_r($sum);

0
投票

尝试这个简单的方法,谢谢,

$sum = [];
foreach($firstArray as $key => $value){
    if(array_key_exists($key,$secondArray)){
        $newArray = [$key=>$value+$secondArray[$key]]; 
        $sum = array_merge($sum,$newArray);
    }else{
        $newArray = [$key=>$value]; 
        $sum = array_merge($sum,$newArray);
    }
}

//your final required result
var_dump($sum);

0
投票

不需要迭代第一个数组,因为根据定义,它的所有键都将保证是唯一的。直接将第一个数组保存到结果中。

然后迭代第二个数组并将其值添加到结果数组中相应的 jey 中,或者如果键对于结果来说是新的,则仅存储该元素。

如果您需要对“小端”键进行排序,请使用

uksort()
并将键重新格式化为“大端”。

代码:(演示

$result = $first;
foreach ($second as $k => $v) {
    $result[$k] = ($result[$k] ?? 0) + $v;
}
uksort(
    $result,
    fn($a, $b) => preg_replace('/(\d+)-(\d+)/', '$2-$1', $a)
                  <=>
                  preg_replace('/(\d+)-(\d+)/', '$2-$1', $b)
);
var_export($result);

-1
投票

试试这个,

$a1 = array (
        '01-1970' => 0.00,
        '03-2019' => 4350.00,
        '05-2019' => 150.00,
        '06-2019' => 50.00
    );

$a2 = array (
        '03-2019' => 0.00,
        '04-2019' => 0.00,
        '06-2019' => 34.83
    );

$sums = array();
foreach (array_keys($a1 + $a2) as $key) {
    $sums[$key] = @($a1[$key] + $a2[$key]);
}

echo "<pre>";
print_r($sums);

这里是您可以使用的其他一些解决方案。

加油!


-2
投票
$sumArray = [];

foreach($firstArray as $key => $value) {
    $sumArray[$key] = $value + ($secondArray[$key] ?? 0);
}
© www.soinside.com 2019 - 2024. All rights reserved.