Суммирование столбцов многомерного массива

Я должен суммировать некоторые столбцы многомерного массива, и я застрял на 3 дня. Мой массив такой:

$items = [
0 => [
0 => [
'category' => 'CATEGORY ONE',
'goal' => 12,
'reached' => '14',
'points' => '148',
],
1 => [
'category' => 'CATEGORY TWO',
'goal' => 12,
'reached' => '14',
'points' => '148',
]
],
1 => [
0 => [
'category' => 'CATEGORY ONE',
'goal' => 12,
'reached' => '14',
'points' => '148',
],
1 => [
'category' => 'CATEGORY TWO',
'goal' => 12,
'reached' => '14',
'points' => '148',
]
]
];

я был не в состоянии разобрать эти данные, чтобы получить сумму значений каждой категории, поэтому он должен возвращаться так:

$items = [
0 => [
'category' => 'CATEGORY ONE',
'goal' => 24,
'reached' => '48',
'points' => '296',
],
1 => [
'category' => 'CATEGORY TWO',
'goal' => 12,
'reached' => '14',
'points' => '296',
]];

0

Решение

Это не универсальный код, но делайте то, что вы хотите

$result = [];
$categoriesData = [];
// aggregate data by category name
foreach ($items as $item) {
foreach ($item as $category) {
$categoryName = $category['category'];
if (!isset($categoriesData[$categoryName])) {
$categoriesData[$categoryName] = [
'goal' => 0,
'reached' => 0,
'points' => 0
];
}
foreach ($category as $key => $value) {
if ($key === 'category') continue;
$categoriesData[$categoryName][$key] += (int) $value;
}
}
}

// result data
foreach ($categoriesData as $key => $value) {
$result[] = [
'category' => $key,
'goal' => (string) $value['goal'],
'reached' => (string) $value['reached'],
'points' => (string) $value['points']
];
}
1

Другие решения

Попробуй это:

$itemsFlattened = call_user_func_array('array_merge', $items);

$itemsSummed = [];
foreach ($itemsFlattened as $item) {
if (array_key_exists($item['category'], $itemsSummed)) {
$itemsSummed[$item['category']]['goal'] += $item['goal'];
$itemsSummed[$item['category']]['reached'] += $item['reached'];
$itemsSummed[$item['category']]['points'] += $item['points'];
} else {
$itemsSummed[$item['category']] = $item;
}
}
$itemsSummed = array_values($itemsSummed);

print_r($itemsSummed);

Выход:

Array
(
[0] => Array
(
[category] => CATEGORY ONE
[goal] => 24
[reached] => 28
[points] => 296
)

[1] => Array
(
[category] => CATEGORY TWO
[goal] => 24
[reached] => 28
[points] => 296
)

)
1