【问题标题】:PHP Sum up values in 2-Dimensional array that have same key valuePHP对具有相同键值的二维数组中的值求和
【发布时间】:2012-07-24 04:59:52
【问题描述】:

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

我目前草率的解决方案是运行一个 foreach,其中包含多个 if 语句来计算出现次数。这对于 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


    【解决方案1】:
    $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

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

    【讨论】:

    • 太快了!在我们说话的时候尝试一下!编辑:谢谢 zerkms,我已经为此争论了四个小时。我永远不会想到您的解决方案。另外,如果您不介意我问,有哪些好书可以学习将来解决此类问题所需的逻辑?
    • @PontusTrade:如果您支持并检查我的答案,那就太好了(左侧有箭头和绿色复选标记);-)
    • @PontusTrade zerkms 就是这么吓人。当我在不到几分钟的时间内看到这样的东西时,让我很羡慕。
    • @PontusTrade:我不确定书籍。我从来没有读过任何具体的东西,它只是将一个任务与一个更小的任务解耦。在这种情况下,显而易见的解决方案是:遍历每个元素并在某处计算小计。如果您手动执行此操作,您会这样做 - 因此您在代码中执行相同操作。
    • @zerkms 我的意思是非常害怕你提供正确答案的速度有多快,我很羡慕你能够如此快速地编写代码:)
    【解决方案2】:
    $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));
    

    如果你想用相同的键来总结所有的值。也就是说,上面的结果就是你希望的。所以我的答案正在接近……就是这样,希望能帮助遇到同样情况的人这个问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      相关资源
      最近更新 更多