通过php中具有多个值的字段对数组进行分组

时间:2014-09-30 17:19:15

标签: php arrays count field grouping

我在尝试使用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个组字段。

如果有人可以帮助我,那将是非常令人沮丧的!

2 个答案:

答案 0 :(得分: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);

它将输出您想要的值,但是作为多维值数组,而不是具有key =>的平面数组;价值对:

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
        )

)

答案 1 :(得分:0)

这将保留值并给出总和。

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

<强> GIVES

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
                        )

                )

        )

)