将二维数组的行数据按一列进行分组,并对每组的另一列进行求和

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

问题: 查找每个 'id''subtotal' 中的值的总和,并将每个 id 的相应总和存储在数组(或变量)中。

我目前草率的解决方案是运行一个带有多个 if 语句的 foreach 来计算出现次数。这对于 5 个 id 之类的内容来说已经足够了,但我必须在 38 个 id 上进行迭代。 如果可能的话,我想将结果按顺序存储在数组中。

如何提高效率?任何和所有的帮助将不胜感激。 (请参阅本文末尾我的草率解决方案以获得好笑)

期望的结果:

  • 所有 ID 1 的总和 = 10
  • 所有 ID 2 的总和 = 18
  • 所有 ID 3 的总和 = 14
  • 所有 ID 4 的总和 = 4
  • 所有 ID 5 的总和 = 3

用于操作的数组代码

    $someArray = array(

    array(
        'id'=> 1,
        'subtotal'=> 5),
    array(
        'id'=> 1,
        'subtotal'=> 5),
    array(
         'id'=> 2,
         'subtotal'=> 6), 
    array(
         'id'=> 2,
         'subtotal'=> 6),
    array(
         'id'=> 2,
         'subtotal'=> 6),
    array(
         'id'=> 3,
         'subtotal'=> 7),
    array(
         'id'=> 3,
         'subtotal'=> 7),
    array(
         'id'=> 4,
         'subtotal'=> 2),
    array(
         'id'=> 4, 
         'subtotal'=> 2),
    array(
         'id'=> 5,
         'subtotal'=> 3),
    );

马虎的解决方案

$sum_id_1 = 0;
$sum_id_2 = 0;
$sum_id_3 = 0;
$sum_id_4 = 0;
$sum_id_5 = 0;

foreach ($someArray as $k) {

    if ($k['id'] == 1) {
        $sum_id_1 += $k['subtotal'];
    }

    if ($k['id'] == 2) {
        $sum_id_2 += $k['subtotal'];
    }

    if ($k['id'] == 3) {
        $sum_id_3 += $k['subtotal'];
    }

    if ($k['id'] == 4) {
        $sum_id_4 += $k['subtotal'];
    }

    if ($k['id'] == 5) {
        $sum_id_5 += $k['subtotal'];
    }
}

草率的解决方案输出(回声)

  • 10
  • 18
  • 14
  • 4
  • 3
php arrays multidimensional-array sum grouping
2个回答
8
投票
$sum = array_reduce($someArray, function($result, $item) {
    if (!isset($result[$item['id']])) $result[$item['id']] = 0;
    $result[$item['id']] += $item['subtotal'];
    return $result;
}, array());

var_dump($sum); // array(5) { [1]=> int(10) [2]=> int(18) [3]=> int(14) [4]=> int(4) [5]=> int(3) }

对于 PHP <= 5.3 perform the counting in loop manually:

$sum = array();

foreach ($someArray as $item) {
    if (!isset($sum[$item['id']])) $sum[$item['id']] = 0;
    $sum[$item['id']] += $item['subtotal'];
}

0
投票
$arr3 = array (
"0" => array ( "001" => 10 ),
"1" => array ( "005" => 20 ),
"2" => array ( "001" => 30 ),
"3" => array ( "003" => 20 ),
"4" => array ( "005" => 80 ),
"5" => array ( "001" => 90 ),
"6" => array ( "003" => 20 ),
"7" => array ( "006" => 80 ),
"8" => array ( "006" => 90 )
) ;

 array (size=4)
   0 => 
      array (size=1)
        '001' => int 130
   1 => 
      array (size=1)
        '005' => int 100
   2 => 
      array (size=1)
       '003' => int 40
   3 => 
      array (size=1)
       '006' => int 170

$outer_array = array();
$unique_array = array();
$inner_array = array();
  foreach($arr3 as $key => $value)
  {

  $item = key($value);
  if(!in_array(key($value), $unique_array))
  {
     array_push($unique_array, $item);
     $inner_array[key($value)] = $value[$item];
     $outer_array[$item][$item] = $value[$item];

  }else{
    $inner_array[key($value)] = $value[$item] + $inner_array[$item];
    $outer_array[$item][$item] = $inner_array[$item];
  }
}
 var_dump(array_values($outer_array));

如果你想用相同的键对所有的值进行求和。也就是说,上面的结果就是你所希望的。所以我的答案很接近……仅此而已,希望能帮助遇到同样情况的人!

© www.soinside.com 2019 - 2024. All rights reserved.