PHP: есть ли команда, которая объединяет массивы с одним и тем же ключом и суммирует содержимое с одинаковыми ключами - PullRequest
0 голосов
/ 10 мая 2018

У меня есть 2 массива массивов, которые я хочу объединить по ключам для первого шага и суммировать их на втором шаге - пример:

Array
(
    [2017-03-01] => Array
        (
            [apples]    => 2
            [bananas]   => 1
        )

    [2017-03-02] => Array
        (
            [apples]    => 3
            [bananas]   => 6
        )

    [2017-03-03] => Array
        (
            [apples]    => 0
            [bananas]   => 4
        )
}


Array
(
    [2017-03-01] => Array
        (
            [apples]    => 3
            [bananas]   => 2
        )

    [2017-03-02] => Array
        (
            [apples]    => 4
            [bananas]   => 7
        )

    [2017-03-03] => Array
        (
            [apples]    => 1
            [bananas]   => 5
        )
}

Требуемый результат:

Array
(
    [2017-03-01] => Array
        (
            [apples]    => 5
            [bananas]   => 3
        )

    [2017-03-02] => Array
        (
            [apples]    => 7
            [bananas]   => 13
        )

    [2017-03-03] => Array
        (
            [apples]    => 1
            [bananas]   => 9
        )
}

Есть ли команда, которая делает это (как одна отдельная команда), которая позволит избежать циклического перемещения по массивам?

Ответы [ 5 ]

0 голосов
/ 10 мая 2018

Спасибо всем за ответы, вот мой код:

function merge_fruit_data($new_data, $old_data){ 

    // If it's the first time running - return new data as an array 
    if (empty($old_data)){
        return $new_data;
    }
    else {

        foreach ( $new_data as $key => $insert_new_data ) {

            if ( !$old_data[$key] ) {
                $old_data[$key] = $insert_new_data;
            }
            else{
                $old_data[$key]['apples']  += $insert_new_data['apples'];
                $old_data[$key]['bananas'] += $insert_new_data['bananas'];
            }
        }

    }

    return $old_data;
}

Комментарии эффективности приветствуются.

0 голосов
/ 10 мая 2018

Решение без for / foreach / ... при условии, что все ключи одинаковы, вы можете сделать:

$array1 = [
    '2017-03-01' => [
        'apples'    => 2,
        'bananas'   => 1,
    ],
    '2017-03-02' => [
        'apples'    => 3,
        'bananas'   => 6,
    ],
    '2017-03-03' => [
        'apples'    => 0,
        'bananas'   => 4,
    ],
];

$array2 = [
    '2017-03-01' => [
        'apples'    => 3,
        'bananas'   => 2,
    ],
    '2017-03-02' => [
        'apples'    => 4,
        'bananas'   => 7,
    ],
    '2017-03-03' => [
        'apples'    => 1,
        'bananas'   => 5,
    ],
];

array_walk($array1, function(&$subarray1, $key) use($array2) {
    array_walk($subarray1, function(&$element, $subkey) use($array2, $key) {
        $element += $array2[$key][$subkey];
    });
});

Не очень хорошая производительность, просто для удовольствия.

0 голосов
/ 10 мая 2018

Вот безумно неэффективный способ, но без использования for foreach или while

$result = array_map(function ($aentry, $key) use ($b) {
    $bentry = $b[$key] ?? [];
    $result = array_map(function ($value, $key) use ($bentry) {
        return [$key, $value + ($bentry[$key] ?? 0) ];
    },$aentry, array_keys($aentry));
    return [ $key, array_combine(array_column($result, 0), array_column($result, 1)) ];
}, $a,array_keys($a));

$result = array_combine(array_column($result, 0), array_column($result, 1));

Пример: http://sandbox.onlinephpfunctions.com/code/4c1dca3057c33dd17d0106666a497c7b08e57038

0 голосов
/ 10 мая 2018

Это может помочь вам

`

$a = array('2017-03-01' => array('apples'=> 2, 'bananas'=>1),
    '2017-03-02' => array('apples'=> 3, 'bananas'=>6),
    '2017-03-03' => array('apples'=> 0, 'bananas'=>4));</p>

<pre><code>$b=array('2017-03-01' => array('apples'=> 3, 'bananas'=>2),
'2017-03-02' => array('apples'=> 4, 'bananas'=>7),
'2017-03-03' => array('apples'=> 1, 'bananas'=>5));

$sumArray = array();
foreach ($a as $key=>$value) {
    $sumArray[$key]['apples']=($a[$key]['apples']+$b[$key]['apples']);
    $sumArray[$key]['bananas']=($a[$key]['bananas']+$b[$key]['bananas']);   
}
</code>

print_r ($ sumArray); `

0 голосов
/ 10 мая 2018

Нет. (обязательные дополнительные символы)

...