Reputation: 71
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
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
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
)
)
Upvotes: 0