将二维数组的行按一列分组,并对组内的另一列求和[重复]

问题描述 投票:0回答:2

给定这个数组:

array(40) {
  [0]=>
  array(10) {
    ["item"]=>
    string(5) "AABBCC"
    ["quants"]=>
    string(1) "1"
  }
  [1]=>
  array(10) {
    ["item"]=>
    string(5) "AABBCC"
    ["quants"]=>
    string(1) "1"
  }  
  [2]=>
  array(10) {
    ["item"]=>
    string(5) "SLF02"
    ["quants"]=>
    string(1) "1"

  }
  [3]=>
  array(10) {
    ["item"]=>
    string(5) "SLF02"
    ["quants"]=>
    string(1) "3"
  }
}

如何在不使用 foreach 的情况下得到以下输出:

  array(40) {
    [0]=>
    array(10) {
      ["item"]=>
      string(5) "AABBCC"
      ["quants"]=>
      string(1) "2"
    }
    [1]=>
    array(10) {
      ["item"]=>
      string(5) "SLF02"
      ["quants"]=>
      string(1) "3"
    }  
  }

是否有任何

array_sum()
函数可以对多维数组执行此操作?

php arrays multidimensional-array sum grouping
2个回答
2
投票

这是一个坏主意,但在没有 foreach 的情况下似乎是一个有趣的挑战:

  $arr = 
[
  [
    "item" =>"AABBCC",
    "quants" => "1",
  ],
  [
    "item" => "AABBCC", 
    "quants" => "1",
  ],
  [
    "item" => "SLF02", 
    "quants" => "1",
  ],
  [
    "item" => "SLF02", 
    "quants" => "3",
  ]
];

$arr = array_values(call_user_func_array("array_merge", array_map(function($i) use ($arr) {
  return [$i["item"] => ["item" => $i["item"], "quants" => array_reduce(
    array_filter($arr, function($j) use ($i) {
        return $j["item"] == $i["item"]; 
    }), function($carry, $item) { 
        return $carry + $item["quants"]; 
    })
  ]];
}, $arr)));

var_dump($arr);

/*
array(2) {
  [0]=>
  array(2) {
    ["item"]=>
    string(6) "AABBCC"
    ["quants"]=>
    int(2)
  }
  [1]=>
  array(2) {
    ["item"]=>
    string(5) "SLF02"
    ["quants"]=>
    int(4)
  }
}
*/

1
投票

这是我的方法:

<?php
$array = array(
    array('item'=>'AABBCC','quants'=>1),
    array('item'=>'AABBCC','quants'=>1),
    array('item'=>'SLF02','quants'=>1),
    array('item'=>'SLF02','quants'=>3),
);

$summed_array = array();

foreach($array as $row){
    $key = $row['item'];

    if(!isset($summed_array[$key])){
        $summed_array[$key] = array(
            'item' => $row['item'],
            'quants' => 0
        );
    }

    $summed_array[$key]['quants'] += $row['quants'];
}

// turn the array back to a 0 based array
$summed_array = array_values($summed_array);

echo '<pre>',print_r($summed_array),'</pre>';
© www.soinside.com 2019 - 2024. All rights reserved.