Darkskies16
Darkskies16

Reputation: 71

Sum arrays values by week number

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

Upvotes: 1

Views: 65

Answers (2)

‌‌R‌‌‌.
‌‌R‌‌‌.

Reputation: 2954

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')); 

Upvotes: 1

h2ooooooo
h2ooooooo

Reputation: 39540

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

Upvotes: 0

Related Questions