これは、実際にここで@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;
}
いずれかは私が間違っているの何を知っていますし、どのように私は上記の二つの問題を解決することができますか?
ありがとうございました。
おかげ@RomanPerekhrest。それは完璧に働いた。私は私の配列操作技術に取り組む必要があると思う。神様があなたを祝福してください。 –
@NeelkanthKaushik、ありがとう、神もあなたを祝福させてください。そして "深い"勉強の幸運 – RomanPerekhrest