如何分组并在数组中求和?

时间:2019-03-09 11:20:10

标签: php arrays group-by

我想按part_no分组,最后显示带销售总额的部件号。

Array
(
    [0] => Array
        (
            [part_no] => 04152-yzza4
            [sale_qty] => 1
        )
[1] => Array
    (
        [part_no] => 04465-YZZR3
        [sale_qty] => 12
    )

[2] => Array
    (
        [part_no] => 04152-yzza1
        [sale_qty] => 3
    )

[3] => Array
    (
        [part_no] => 04465-YZZR3
        [sale_qty] => 1
    )

[4] => Array
    (
        [part_no] => 04465-YZZR3
        [sale_qty] => 1
        )

)

输出应为:

04152-yzza4:1

04465-YZZR3:14

04152-yzza1:3

我尝试过函数和类,但对我没有任何帮助,请帮忙

3 个答案:

答案 0 :(得分:1)

一个简单的foreach循环可以做到这一点:

https://3v4l.org/1dfov

<?php

$input = [
    ['part_no'=>'test1','sale_qty' => 4],
    ['part_no'=>'test1','sale_qty' => 2],
    ['part_no'=>'test2','sale_qty' => 1],
    ['part_no'=>'test3','sale_qty' => 3],
];


$output = [];
foreach($input as $i) {
    if(!isset($output[$i['part_no']])) {
        $output[$i['part_no']] = 0;    
    }

    $output[$i['part_no']] += $i['sale_qty'];
}
var_dump($output);

输出

  

array(3){     [“ test1”] =>     整数(6)     [“ test2”] =>     整数(1)     [“ test3”] =>     整数(3)   }

参考文献:

http://php.net/manual/en/control-structures.foreach.php

答案 1 :(得分:0)

您可以使用这种怪物:

$array = array(
    0 => 
    array (
        'part_no' => '04152-yzza4',
        'sale_qty' => 1
    ),
    1 => 
    array (
        'part_no' => '04465-YZZR3',
        'sale_qty' => 12
    ),
    2 => 
    array (
        'part_no' => '04152-yzza1',
        'sale_qty' => 3
    ),
    3 => 
    array (
        'part_no' => '04465-YZZR3',
        'sale_qty' => 1
    ),
    4 => 
    array (
        'part_no' => '04465-YZZR3',
        'sale_qty' => 1
    )
);

$t = [];

array_walk($array,function($v)use(&$t){($k=$v['part_no'])&&!isset($t[$k])?$t[$k]=$v['sale_qty']:$t[$k]+=$v['sale_qty'];});

print_r($t);

输出:

Array
(
    [04152-yzza4] => 1
    [04465-YZZR3] => 14
    [04152-yzza1] => 3
)

Sandbox

未压缩版本

  array_walk($array,
      function($value) use (&$total){
         $key = $value['part_no']; 
         if(!isset($total[$key])){
              $total[$key] = $value['sale_qty'];
         }else{
              $total[$key] += $value['sale_qty'];
         }
      }
  );

相同的输出

Sandbox

数组遍历的工作方式与foreach相似,因为它遍历或循环遍历数组,您可以使用数组映射,但这意味着回调将修改原始数组,在此我们不做介绍。相反,我们可以使用use()关键字作为Closure并通过与号$total的引用传递&,每当我们为其分配值时,动态更新它(主要是因为我们可以不能从关闭中返回)。

其余的基本知识。

答案 2 :(得分:-1)

简单的foreach()将完成以下工作:

$new = [];
foreach($arr as $v){
    $new[$v['part_no']] = isset($new[$v['part_no']]) ? $new[$v['part_no']] + $v['qty'] : $v['qty'];
}

Demo