【问题标题】:Associative array, sum values of the same key关联数组,对同一个键的值求和
【发布时间】:2012-12-21 04:19:39
【问题描述】:

所以我有这个关联数组(用 kint 完成转储)

而不是让键“Conference”重复 3 次。我只想拥有一次,然后将 3 个值合为一个,以便获得类似的结果:

会议:4534

对于所有其他重复的键也是如此..

有没有可以做到这一点的原生函数?

【问题讨论】:

    标签: php arrays sum associative-array


    【解决方案1】:

    你可以试试

    $data = array(
      0 => array(
        'event' => 'Conference',
        'budget' => 3700,
      ),
      1 => array(
        'event' => 'Conference',
        'budget' => 500,
      ),
      2 => array(
        'event' => 'Showroom',
        'budget' => 1000,
      ),
      3 => array(
        'event' => 'Mission Chez client',
        'budget' => 2000,
      ),
      4 => array(
        'event' => 'Séminaire',
        'budget' => 700,
      ),
      5 => array(
        'event' => 'Livraison',
        'budget' => 4000,
      ),
      6 => array(
        'event' => 'Conference',
        'budget' => 334,
      ),
    );
    
    $sum = array_reduce($data, function ($a, $b) {
        isset($a[$b['event']]) ? $a[$b['event']]['budget'] += $b['budget'] : $a[$b['event']] = $b;  
        return $a;
    });
    
    
    print_r(array_values($sum));
    

    输出

    Array
    (
        [0] => Array
            (
                [event] => Conference
                [budget] => 4534
            )
    
        [1] => Array
            (
                [event] => Showroom
                [budget] => 1000
            )
    
        [2] => Array
            (
                [event] => Mission Chez client
                [budget] => 2000
            )
    
        [3] => Array
            (
                [event] => Séminaire
                [budget] => 700
            )
    
        [4] => Array
            (
                [event] => Livraison
                [budget] => 4000
            )
    
    )
    

    【讨论】:

    • 它保留了第二个关键“预算”但不保留第一个“事件”,它给出了这个:link
    • 我确实需要保持相同的结构,但使用相同的键对值求和
    • 谢谢巴巴,这正是我要找的,但似乎这些值被求和了两次:1-原始数组link 2-求和函数后的数组link'Livraison'例如应该有 4000,知道为什么它有 8000 吗?
    • 我无法处理图像...使用原始数组的 print_r 并将其添加到 pastebin
    • 原始数组link 。结果数组link
    【解决方案2】:

    一个简单的建议:

    $results = array();
    foreach ($budgetByEventTemp as $value)
    {
      if( ! isset($results[$value['event']]) )
      {
         $results[$value['event']] = 0;
      }
    
      $results[$value['event']] += $value['budget'];
    
    }
    
    var_dump($results);
    

    更新根据 cmets

    你可以再次碾过它们:

    foreach($results as $key => $value)
    {
      $structured_results[] = array('event' => $key, 'budget' => $value);
    }
    
    var_dump($structured_results);
    

    【讨论】:

    • 感谢您的建议,但这不会保留数组的键(事件和预算)
    • 当你不想总结价值时,我不明白为什么应该这样做?
    • 这个数组是通过 json 编码并发送到其他地方煮熟的,所以我需要保留相同的结构并用相同的键对值求和
    【解决方案3】:
    $sumArray = array();
    
    foreach ($myArray as $k=>$subArray) {
    foreach ($subArray as $id=>$value) {
      $sumArray[$id]+=$value;
      }
    }
    
    print_r($sumArray);
    

    【讨论】:

    • 这个无法解释的答案会产生警告/错误。证明:3v4l.org/CHfSE
    【解决方案4】:

    此选项将对数组中所有重复索引的值进行分组和求和。

    代码在这里:

    $aValues[]=array("nametogroup",10);
    $aValues[]=array("nametogroup",20);
    $aValues[]=array("nametogroup2",30);
    $aValues[]=array("nametogroup2",20);
    echo var_dump($aValues); // array before grouping
    foreach ($aValues as  $id=>$value) 
    {
      $a2sum["{$value[0]}"]=$value[1] + $a2sum["{$value[0]}"];
    }
    echo var_dump($a2sum); //array after group and adding values
    

    这将导致:

    array
    0 => 
    array
      0 => string nametogroup (length=11)
      1 => int 10
    1 => 
    array
      0 => string nametogroup (length=11)
      1 => int 20
    2 => 
    array
      0 => string nametogroup2 (length=12)
      1 => int 30
    3 => 
    array
      0 => string nametogroup2 (length=12)
      1 => int 20
    
    array
    nametogroup => int 30
    nametogroup2 => int 50
    

    【讨论】:

      【解决方案5】:

      要迭代一组数据并返回一组可能更小的数据,array_reduce() 是一个明智的“函数式”选择。以下是 @Baba 使用空合并运算符和更直观的变量命名约定的答案的细微变化。

      代码:(Demo)

      var_export(
          array_reduce(
              $data,
              function ($carry, $row) {
                  $carry[$row['event']] = ($carry[$row['event']] ?? 0) + $row['budget'];
                  return $carry;
              }
          )
      );
      

      【讨论】:

        猜你喜欢
        • 2017-11-15
        • 1970-01-01
        • 1970-01-01
        • 2022-11-03
        • 1970-01-01
        • 2016-05-23
        • 1970-01-01
        • 2013-02-09
        • 2022-01-12
        相关资源
        最近更新 更多