Группировка многомерного массива PHP и вычисление суммы определенного ключа для каждого элемента массива

У меня был массив, в котором были данные обо всех проектах.

Мне нужно было сгруппировать массив с помощью элемента year_actual.

Я успешно выполнил эту группировку с помощью php-функции «array_group_by», которая доступна здесь: https://gist.github.com/mcaskill/baaee44487653e1afc0d

Вот мой групповой массив, который я присвоил переменной: $ projects_grouped_by_year

Array ( [2016] => Array ( [0] => Array ( [id] => 1 [project_name] => P1 [project_capacity] => 100 [year_actual] => 2016 [companies] => Array ( [0] => Array ( [id] => 1 [project_id] => 1 [company_type] => C1 [capacity_share] => 12 [project_year] => 2016 ) [1] => Array ( [id] => 2 [project_id] => 1 [company_type] => C2 [capacity_share] => 14 [project_year] => 2016 ) ) ) [1] => Array ( [id] => 2 [project_name] => P2 [project_capacity] => 200 [year_actual] => 2016 [companies] => Array ( [0] => Array ( [id] => 3 [project_id] => 2 [company_type] => C2 [capacity_share] => 15 [project_year] => 2016 ) [1] => Array ( [id] => 4 [project_id] => 2 [company_type] => C1 [capacity_share] => 16 [project_year] => 2016 ) ) ) ) [2014] => Array ( [0] => Array ( [id] => 3 [project_name] => P3 [project_capacity] => 300 [year_actual] => 2014 [companies] => Array ( [0] => Array ( [id] => 5 [project_id] => 3 [company_type] => C1 [capacity_share] => 20 [project_year] => 2014 ) [1] => Array ( [id] => 6 [project_id] => 3 [company_type] => C2 [capacity_share] => 22 [project_year] => 2014 ) ) ) [1] => Array ( [id] => 4 [project_name] => P4 [project_capacity] => 400 [year_actual] => 2014 [companies] => Array ( [0] => Array ( [id] => 7 [project_id] => 4 [company_type] => C2 [capacity_share] => 11 [project_year] => 2014 ) [1] => Array ( [id] => 8 [project_id] => 4 [company_type] => C1 [capacity_share] => 10 [project_year] => 2014 ) ) ) ) ) 

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

 Array ( [0] => Array( //year_actual of project 'year' => 2016, //[100+200] : sum of 'project_capacity' where year_actual = 2016 'project_capacity_sum' => 300, //[12+16] : sum of 'capacity_share' where company_type = C1 and project_year = 2016 'C1_capacity_sum' => 28, //[14+15] : sum of 'capacity_share' where company_type = C2 and project_year = 2016 'C2_capacity_sum' => 29 ) [1] => Array( //year_actual of project 'year' => 2014, //[300+400] : sum of 'project_capacity' where year_actual = 2014 'project_capacity_sum' => 700, //[20+10] : sum of 'capacity_share' where company_type = C1 and project_year = 2014 'C1_capacity_sum' => 30, //[22+11] : sum of 'capacity_share' where company_type = C2 and project_year = 2014 'C2_capacity_sum' => 33 ) ); 

Мне удалось вычислить поле «project_capacity_sum», используя приведенный ниже код:

$projectCapacitySum = array_map(function($data) { return array_sum(array_column($data, 'project_capacity')); }, $projects_grouped_by_year);

Но я боюсь рассчитать другие поля за последние два дня.

Единственные полезные столбцы для меня следующие:

[project_capacity] и [year_actual]

Внутри массива «компании»

[company_type] и [capacity_share]

В основном я пытаюсь группировать массив с помощью «year_actual» (который я уже сделал). Затем каждый год набирайте общее количество «project_capacity», а также общее количество «capacity_share» для каждого «company_type» в каждом году. Я надеюсь в этом есть смысл.

Нет проблем, если мы используем колонку [project_year] внутри вспомогательной массива [companies] для достижения желаемого результата.

Я знаю, что мне нужно сделать еще одну группу внутри массива sub. И я все еще пытаюсь это сделать.

На данный момент меня не интересует эффективность кода или оптимизация. Я просто ищу рабочую логику.

Я прошу о помощи. Пожалуйста, помогите мне с этим.

Благодарю.

Чтобы получить необходимый результат, расширьте свое начальное решение ( array_map + array_sum + array_column ) с помощью следующего подхода:

 $sumData = array_map(function ($v) { $arr = ['year' => current(array_column($v, 'year_actual'))]; $arr['project_capacity_sum'] = array_sum(array_column($v, "project_capacity")); $arr['C2_capacity_sum'] = $arr['C1_capacity_sum'] = 0; foreach ($v as $item) { // iterating through the nested items $c_capacities = array_column($item['companies'], 'capacity_share', 'company_type'); $arr['C1_capacity_sum'] += $c_capacities['C1']; $arr['C2_capacity_sum'] += $c_capacities['C2']; } return $arr; }, $projects_grouped_by_year); print_r($sumData); 

Выход:

 Array ( [2016] => Array ( [year] => 2016 [project_capacity_sum] => 300 [C1_capacity_sum] => 28 [C2_capacity_sum] => 29 ) [2014] => Array ( [year] => 2014 [project_capacity_sum] => 700 [C1_capacity_sum] => 30 [C2_capacity_sum] => 33 ) )