2016-07-02 8 views
1

Это фактически является расширенной версией оригинального кода разместил @RomanPerekhrest здесь: Grouping multidimensional PHP array and calculating sum of a particular key for each arrays elementРасширенный код: Группировка многомерный массив 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. Затем он отображает следующее уведомление:

Notice: Undefined индекс: 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] => значение pair, то он учитывает только последнюю пару [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; 
} 

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

Спасибо.

ответ

1

А вот решение :)

$sumData = array_map('prepare_data', $projects_grouped_by_year); 
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) { 
     // summing up companies shares 
     $c_types = array_column($item['companies'], 'company_type'); 
     $c_shares = array_column($item['companies'], 'capacity_share'); 
     foreach ($c_types as $k => $v) { 
      $arr[$v ."_capacity_sum"] += $c_shares[$k]; 
     } 
     // summing up holders shares 
     $h_types = array_column($item['holders'], 'holder_type'); 
     $h_shares = array_column($item['holders'], 'holder_share'); 
     foreach ($h_types as $k => $v) { 
      $arr[$v ."_capacity_sum"] += $h_shares[$k]; 
     }   
    } 

    return $arr; 
} 

print_r($sumData); 
+0

Благодаря @RomanPerekhrest. Он работал безупречно. Я думаю, мне нужно работать над навыками манипуляции с массивами. Да благословит тебя Бог. –

+0

@NeelkanthKaushik, спасибо, Пусть Бог благословит вас тоже. И удачи в «глубоком» изучении – RomanPerekhrest