【问题标题】:Grouping arrays by a field with multiple values in php在php中按具有多个值的字段对数组进行分组
【发布时间】:2014-09-30 17:19:15
【问题描述】:

我在尝试在 php 中对具有多个值的数组进行分组时遇到问题...

给定一个数组:

$in[] = array('year' => '2010', 'month' => '11', 'grupo' => '2', 'quantity' => 3);
$in[] = array('year' => '2010', 'month' => '11', 'grupo' => '3', 'quantity' => 4);
$in[] = array('year' => '2011', 'month' => '2', 'grupo' => '2', 'quantity' => 4);
$in[] = array('year' => '2011', 'month' => '2', 'grupo' => '2', 'quantity' => 4);
$in[] = array('year' => '2012', 'month' => '3', 'grupo' => '4', 'quantity' => 3);
$in[] = array('year' => '2012', 'month' => '3', 'grupo' => '4', 'quantity' => 3);

我想得到:

$out[] = array('year' => '2010', 'month' => '11', 'grupo' => '2', 'quantity' => 3);
$out[] = array('year' => '2010', 'month' => '11', 'grupo' => '3', 'quantity' => 4);
$out[] = array('year' => '2011', 'month' => '2', 'grupo' => '2', 'quantity' => 8);
$out[] = array('year' => '2012', 'month' => '3', 'grupo' => '4', 'quantity' => 6);

我尝试过这样的事情:

$out = array();
foreach ($in as $row) {
    if (!isset($out[$row['year']['month']['grupo']])) {
        $out[$row['year']['month']['grupo']] = array(
            'year' => $row['year'],
            'month' => $row['month'],
            'grupo' => $row['grupo'],
            'quantity' => 0,
        );
    }
    $out[$row['year']['month']['grupo']]['quantity'] += $row['quantity'];
}
$out = array_values($out);

但由于 3 个组字段而失败。

如果有人可以帮助我,将不胜感激!

【问题讨论】:

    标签: php arrays count field grouping


    【解决方案1】:

    试试这个:

    $out = array();
    foreach ($in as $row) {
        if(! isset($out[$row['year']][$row['month']][$row['grupo']])) {
            $out[$row['year']][$row['month']][$row['grupo']]=0;
        }
        $out[$row['year']][$row['month']][$row['grupo']] += $row['quantity'];
    }
    print_r($out);
    

    它会输出你想要的值,但是作为一个多维值数组,而不是一个带有键 => 值对的平面数组:

    Array
    (
        [2010] => Array
            (
                [11] => Array
                    (
                        [2] => 3
                        [3] => 4
                    )
    
            )
    
        [2011] => Array
            (
                [2] => Array
                    (
                        [2] => 8
                    )
    
            )
    
        [2012] => Array
            (
                [3] => Array
                    (
                        [4] => 6
                    )
    
            )
    
    )
    

    但是你可以重新排列你的数组:

    $out2 = array();
    foreach($out as $year => $year_array) {
      foreach($year_array as $month => $month_array) {
        foreach($month_array as $grupo => $quantity) {
          $out2[] = array('year' => $year, 'month' => $month, 'grupo' => $grupo, 'quantity' => $quantity);
        }
      }
    }
    print_r($out2);
    

    这将输出:

    Array
    (
        [0] => Array
            (
                [year] => 2010
                [month] => 11
                [grupo] => 2
                [quantity] => 3
            )
    
        [1] => Array
            (
                [year] => 2010
                [month] => 11
                [grupo] => 3
                [quantity] => 4
            )
    
        [2] => Array
            (
                [year] => 2011
                [month] => 2
                [grupo] => 2
                [quantity] => 8
            )
    
        [3] => Array
            (
                [year] => 2012
                [month] => 3
                [grupo] => 4
                [quantity] => 6
            )
    
    )
    

    【讨论】:

    • 感谢您的回复,但我需要按数量排序,我正在考虑使用:foreach ($out as $key => $row) { $aux[$key] = $row['数量']; } array_multisort($aux, SORT_DESC, $out);
    • 我以为你会单独解决这个问题,但就是这样。
    【解决方案2】:

    这将保留值并给出总和。

    foreach($in as $row) {
                $out[$row['year']][$row['month']][$row['grupo']]['quantity'][]  =   $row['quantity'];
                $out[$row['year']][$row['month']][$row['grupo']]['sum']         =   array_sum($out[$row['year']][$row['month']][$row['grupo']]['quantity']);
            }
    
    print_r($out);
    

    给予

    Array
    (
        [2010] => Array
            (
                [11] => Array
                    (
                        [2] => Array
                            (
                                [quantity] => Array
                                    (
                                        [0] => 3
                                    )
    
                                [sum] => 3
                            )
    
                        [3] => Array
                            (
                                [quantity] => Array
                                    (
                                        [0] => 4
                                    )
    
                                [sum] => 4
                            )
    
                    )
    
            )
    
        [2011] => Array
            (
                [2] => Array
                    (
                        [2] => Array
                            (
                                [quantity] => Array
                                    (
                                        [0] => 4
                                        [1] => 4
                                    )
    
                                [sum] => 8
                            )
    
                    )
    
            )
    
        [2012] => Array
            (
                [3] => Array
                    (
                        [4] => Array
                            (
                                [quantity] => Array
                                    (
                                        [0] => 3
                                        [1] => 3
                                    )
    
                                [sum] => 6
                            )
    
                    )
    
            )
    
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      相关资源
      最近更新 更多