【问题标题】:Grouping multidimensional PHP array and calculating sum of a particular key for each arrays element对多维 PHP 数组进行分组并计算每个数组元素的特定键的总和
【发布时间】:2016-06-26 12:04:07
【问题描述】:

我有一个包含所有项目数据的数组。

我需要按“year_actual”元素对数组进行分组。

我已经使用 php 函数“array_group_by”成功完成了这个分组,可以在这里找到:https://gist.github.com/mcaskill/baaee44487653e1afc0d

这是我分配给变量的分组数组:$projects_grouped_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] => C2                                    
                                    [capacity_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
                                )

                        )

                )

        )

    [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
                                )

                        )

                )

            [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
                                )

                        )

                )

        )

) 

我正在操作上面的数组来创建一个新的以下结果数组: 我将创建一个新数组并将计算的值插入到这个新数组中:

Array
(
    [0] => Array(
        //year_actual of project
        'year' => 2016,
         //[100+200] : sum of 'project_capacity' where year_actual = 2016 
        'project_capacity_sum' => 300,
         //[12+16] : sum of 'capacity_share' where company_type = C1 and project_year = 2016
        'C1_capacity_sum' => 28,
         //[14+15] : sum of 'capacity_share' where company_type = C2 and project_year = 2016
        'C2_capacity_sum' => 29
        )
    [1] => Array(
         //year_actual of project
        'year' => 2014,
         //[300+400] : sum of 'project_capacity' where year_actual = 2014
        'project_capacity_sum' => 700,
         //[20+10] : sum of 'capacity_share' where company_type = C1 and project_year = 2014
        'C1_capacity_sum' => 30,
         //[22+11] : sum of 'capacity_share' where company_type = C2 and project_year = 2014
        'C2_capacity_sum' => 33
        )
); 

我已成功使用以下代码计算字段“project_capacity_sum”:

$projectCapacitySum = array_map(function($data) { return array_sum(array_column($data, 'project_capacity')); }, $projects_grouped_by_year);

但是最近两天我正在努力计算其他字段。

对我来说唯一有用的专栏如下:

[项目容量] 和 [year_actual]

在“公司”子数组中

[公司类型] 和 [容量共享]

基本上我正在尝试按“year_actual”对数组进行分组(我已经这样做了) 然后找到每年的总“project_capacity”以及每年每个“company_type”的总“capacity_share”。我希望这是有道理的。

如果我们使用 [companies] 子数组中的 [project_year] 列来实现所需的输出,则没有问题。

我知道我必须在公司子数组中进行另一个分组。我仍在尝试这样做。

此时我并不关心代码效率或优化。我只是在寻找一个可行的逻辑。

我正在寻求帮助。请帮我解决这个问题。

谢谢。

【问题讨论】:

  • 你是如何使用其他列的?给我们一个实际上不起作用的代码示例,我们自己很难弄清楚。
  • 对我来说唯一有用的列如下:对于每年内部的每个项目:[project_capacity] 和 [year_actual] 在“companies”子数组中:[company_type] 和 [capacity_share] 基本上我正在尝试组按“year_actual”排列的数组(我已经完成了)然后找到每年的总“project_capacity”以及每年每个“company_type”的总“capacity_share”。我希望这是有道理的。
  • 如果我们使用 [companies] 子数组中的 [project_year] 列来实现所需的输出,是没有问题的。
  • 现在又想到了一个问题,您如何处理这些公司类型和共享容量?请记住,您在一个多维数组中,并且必须执行第二个“映射”才能处理它。 array.map(function(data){ ... $returnvalue = array.map($secondArrayData) {...}, $data.companies ...}, $projects_by_year);.
  • 我知道我必须在公司子数组中进行另一个分组。我仍在尝试这样做。

标签: php arrays multidimensional-array


【解决方案1】:

要获得所需的结果,请使用以下方法扩展您的初始解决方案 (array_map + array_sum + array_column):

$sumData = array_map(function ($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;

    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'];
    }

    return $arr;
}, $projects_grouped_by_year);

print_r($sumData);

输出:

Array
(
    [2016] => Array
        (
            [year] => 2016
            [project_capacity_sum] => 300
            [C1_capacity_sum] => 28
            [C2_capacity_sum] => 29
        )

    [2014] => Array
        (
            [year] => 2014
            [project_capacity_sum] => 700
            [C1_capacity_sum] => 30
            [C2_capacity_sum] => 33
        )
)

【讨论】:

  • 嗨,@RomanPerekhrest。我玩过您的代码并尝试将其扩展到下一个级别。我在某种程度上成功了,但后来我发现了两个问题,我正在努力解决这个问题。我发布了一个新问题here。如果您根据自己的方便看一下,那就太好了。谢谢。
猜你喜欢
  • 2016-11-04
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多