2016-07-02 7 views
1

これは、実際にここで@RomanPerekhrestによってポスト元のコードの拡張版であるため、特定のキーの和を計算する:私はコードで再生しようとしたGrouping multidimensional PHP array and calculating sum of a particular key for each arrays element拡張コード:多次元PHP配列をグループ化し、各アレイ素子

それを次のレベルに広げる。そしてある程度私は成功しました。

私は、既存の「企業」サブアレイに加えて、「ホルダー」というサブアレイをもう1つ追加しました。そして、 "企業"サブアレイからの "capacity_share"と "holder"サブアレイからの "holder_share"の合計を計算しました。

そして、それは魅力的に機能しました。私は、以下の拡張されたコードを追加しています:

は、変数に割り当てられた以下のアレイ考えてみましょう:

$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; 
} 

しかし、私のコードです:$ 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 
          ) 

        ) 

      ) 

    ) 

) 

そして私の下のコードを使用して、完璧な結果を得ます

まず条件:

二つの条件の下でうまく機能していません

同じ[company_type] =>値のペアを持つすべてのサブ配列を追加するとします。

注意:未定義のインデックス: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] =>値を有する複数のサブアレイを追加する場合、それは通知を次の表示します[capacity_share]を追加するための最後の[company_type] =>値のペアのみを考慮します。例えば、それは、以下の場合には、[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