На самом деле это расширенная версия исходного кода, размещенная @RomanPerekhrest здесь: группировка многомерного массива PHP и вычисление суммы конкретного ключа для каждого элемента массивов
Я играл с кодом и пытался расширить его до следующего уровня. И в какой-то степени мне это удалось.
Что сделано, так это то, что я добавил еще один дополнительный массив под названием «держатели» в дополнение к существующему подсистему «компании». А затем вычислил сумму «capacity_share» из подмассовой группы «компании» и «holder_share» из подмассового массива «держатели».
И это сработало как шарм. Я добавляю расширенный код ниже:
Рассмотрим массив, присвоенный переменной: $ projects_group_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] => C1 [capacity_share] => 14 [project_year] => 2016 ) ), [holders] => Array ( [0] => Array ( [id] => 1 [project_id] => 1 [holder_type] => H1 [holder_share] => 12 [project_year] => 2016 ) [1] => Array ( [id] => 2 [project_id] => 1 [holder_type] => H2 [holder_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 ) ), [holders] => Array ( [0] => Array ( [id] => 3 [project_id] => 2 [holder_type] => H1 [holder_share] => 12 [project_year] => 2016 ) [1] => Array ( [id] => 4 [project_id] => 2 [holder_type] => H2 [holder_share] => 14 [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 ) ), [holders] => Array ( [0] => Array ( [id] => 5 [project_id] => 3 [holder_type] => H1 [holder_share] => 12 [project_year] => 2014 ) [1] => Array ( [id] => 6 [project_id] => 3 [holder_type] => H2 [holder_share] => 14 [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 ) ), [holders] => Array ( [0] => Array ( [id] => 7 [project_id] => 4 [holder_type] => H1 [holder_share] => 12 [project_year] => 2014 ) [1] => Array ( [id] => 8 [project_id] => 4 [holder_type] => H2 [holder_share] => 14 [project_year] => 2014 ) ) ) ) )
И используя код ниже, я получаю идеальный результат:
$sumData = array_map('prepare_data', $projects_group_by_year); print_r($sumData); exit; function prepare_data($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; $arr['H2_capacity_sum'] = $arr['H1_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']; $h_shares = array_column($item['holders'], 'holder_share', 'holder_type'); $arr['H1_share_sum'] += $h_shares['H1']; $arr['H2_share_sum'] += $h_shares['H2']; } return $arr; }
Но мой код плохо работает в двух условиях:
Первое условие:
Если я добавлю все вспомогательные массивы с той же парой [company_type] => value. Затем он отображает следующее уведомление:
Примечание: Неопределенный индекс: C2
[companies] => Array ( [0] => Array ( [id] => 1 [project_id] => 1 [company_type] => C1 //Notice here [capacity_share] => 12 [project_year] => 2016 ) [1] => Array ( [id] => 2 [project_id] => 1 [company_type] => C1 //Notice here [capacity_share] => 14 [project_year] => 2016 ) )
Второе условие:
Если я добавляю более одного вспомогательного массива с той же парой [company_type] => value, то он учитывает только последнюю пару [company_type] => значение для добавления [capacity_share]. Например, он использует [capacity_share] => 15 в приведенном ниже примере и не рассматривает [capacity_share] => 14.
[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 //Notice here [capacity_share] => 14 [project_year] => 2016 ), [2] => Array ( [id] => 3 [project_id] => 1 [company_type] => C2 //Notice here [capacity_share] => 15 [project_year] => 2016 ) )
Я работаю над устранением вышеуказанных проблем за последние несколько дней.
Ниже приведен один из фрагментов кода, который я попытался выполнить:
function prepare_data($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; $arr['H2_share_sum'] = $arr['H1_share_sum'] = 0; foreach ($v as $item) {// iterating through the nested items $c_capacities = array_column($item['companies'], 'capacity_share', 'company_type'); if(isset($c_capacities['company_type'])){ $arr['C1_capacity_sum'] += $c_capacities['company_type']; } if(isset($c_capacities['C2'])){ $arr['C2_capacity_sum'] += $c_capacities['C2']; } $h_shares = array_column($item['holders'], 'holder_share', 'holder_type'); $arr['H1_share_sum'] += $s_capacities['H1']; $arr['H2_share_sum'] += $s_capacities['H2']; } return $arr; }
Кто-нибудь знает, что я делаю неправильно, и как я могу исправить эти две проблемы?
Благодарю.