1

Can you sum the below array of sales by weeknumber

Array
(
    [0] => Array
    (
        [DATE] => 2015-03-06
        [store] => 18
        [weeknum] => 11
        [sales] => 10
    )
  [1] => Array
    (
        [DATE] => 2015-03-08
        [store] => 18
        [weeknum] => 11
        [sales] => 5
    )
  [2] => Array
    (
        [DATE] => 2015-03-09
        [store] => 18
        [weeknum] => 11
        [sales] => 5
    )

I would like to achieve something like this

 [0] => Array
    (

        [store] => 18
        [weeknum] => 11
        [sales] => 20
    )

so far i have tried array sum but that doesnt seem to work

Darkskies16
  • 71
  • 1
  • 8

2 Answers2

1

There are many different ways and answers (eg.). For instance:

Using Array Reduce:

$total_sales = array_reduce($items, function($carry, $item){
    $carry['store']   = $item['store'];
    $carry['weeknum'] = $item['weeknum'];
    $carry['sales']  += $item['sales'];
    return $carry;
}, []);

Or Using Array column:

$total_sales = array_sum(array_column($items, 'sales')); 
Community
  • 1
  • 1
‌‌R‌‌‌.
  • 2,818
  • 26
  • 37
0

Simply iterate through the array and add the field values to a sum container.

I've also added the store number as a unique identifier in case there's multiple stores you want individual info for. If you want it for all stores just change $key = $weekNumber . $item['store']; out with $key = $weekNumber;.

Data:

$items = [
    [
        'DATE' => '2015-03-06',
        'store' => 18,
        'weeknum' => 11,
        'sales' => 10,
    ],
    [
        'DATE' => '2015-03-08',
        'store' => 18,
        'weeknum' => 11,
        'sales' => 5,
    ],
    [
        'DATE' => '2015-03-09',
        'store' => 18,
        'weeknum' => 11,
        'sales' => 5,
    ],
    [
        'DATE' => '2015-03-09',
        'store' => 18,
        'weeknum' => 12,
        'sales' => 5,
    ],
];

Code:

<?php

$storeWeekSums = [];

foreach ($items as $item) {
    // Save the key to refer to it later
    $weekNumber = $item['weeknum'];

    $key = $weekNumber . $item['store'];

    if (!isset($weekSums[$weekNumber])) {
        // The week and store does not already exist, let's create it with a value
        $storeWeekSums[$key] = [
            'store' => $item['store'],
            'weeknum' => $item['weeknum'],
            'sales' => $item['sales'],
        ];
    } else {
        // The week and store already exists, so we'll add to the current value instead
        $storeWeekSums[$key]['sales'] += $item['sales'];
    }
}

print_r($storeWeekSums);

Output::

Array
(
    [1118] => Array
        (
            [store] => 18
            [weeknum] => 11
            [sales] => 5
        )

    [1218] => Array
        (
            [store] => 18
            [weeknum] => 12
            [sales] => 5
        )

)

DEMO

h2ooooooo
  • 39,111
  • 8
  • 68
  • 102