Intereting Posts
Как расширить многоугольник на определенное расстояние в PHP / Mysql? Предупреждение: mysqli_query () ожидает, что параметр 1 будет mysqli, null указан в unifcationengine не работает с google + share Как надежно и быстро развиваться на удаленном сервере с локальной средой IDE? Формат времени с помощью Highcharts PHP: включение страницы из глубоко вложенной иерархии каталогов – проблема с производительностью Как мы можем отправлять сообщения GCM в большом количестве 1000 в базу данных, скажем, из 10 000 зарегистрированных пользователей? Неустранимая ошибка: Недостаточно памяти (выделено 1134559232) (попытался выделить 32768 байт) в X: \ wamp \ www \ xxx Как создать таблицу столбцов php 2 со значениями из базы данных? thumbnail видео в php при загрузке Интеграция Grunt / Gulp и Livereload с существующим сервером Apache, обслуживающим PHP / Zend .htaccess разрешает доступ к файлам только из Разрешение Laravel 404 Форматирование строки даты в PHP GET, URL-Rewrite

Расширенный код: группировка многомерного массива PHP и вычисление суммы отдельных ключей для каждого элемента массива

На самом деле это расширенная версия исходного кода, размещенная @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; } 

Кто-нибудь знает, что я делаю неправильно, и как я могу исправить эти две проблемы?

Благодарю.