【问题标题】:Group array data on one column and sum data from another column在一列上对数组数据进行分组,并对另一列中的数据求和
【发布时间】:2018-05-22 11:51:15
【问题描述】:

我的数组数据如下所示:

$array = [
    ['name' => 'Bank BRI', 'amount' => 0], 
    ['name' => 'Bank BRI', 'amount' => 0], 
    ['name' => 'Bank BCA', 'amount' => 1412341234],
    ['name' => 'Bank CIMB Niaga', 'amount' => 532532552], 
    ['name' => 'Bank BRI', 'amount' => 34534534], 
    ['name' => 'Bank CIMB Niaga', 'amount' => 453425243], 
    ['name' => 'Bank BRI', 'amount' => 0], 
    ['name' => 'Bank BNI', 'amount' => 124124], 
    ['name' => 'Bank CIMB Niaga', 'amount' => 352345623], 
    ['name' => 'Bank BCA', 'amount' => 23432423], 
    ['name' => 'Bank Mandiri', 'amount' => 0], 
    ['name' => 'Bank BCA', 'amount' => 0], 
    ['name' => 'Bank BCA', 'amount' => 0], 
    ['name' => 'Bank Permata', 'amount' => 352352353],
];

如何根据相同的“银行名称”计算“金额”。

我的结果应该显示分组名称及其总和:

array (
  'Bank BRI' => 34534534,
  'Bank BCA' => 1435773657,
  'Bank CIMB Niaga' => 1338303418,
  'Bank BNI' => 124124,
  'Bank Mandiri' => 0,
  'Bank Permata' => 352352353,
)

【问题讨论】:

    标签: php arrays multidimensional-array sum grouping


    【解决方案1】:

    所以,首先您需要$amountsArray 以某种方式分配您列出的值。那么:

    $bankTotals = array();
    foreach($amountsArray as $amount)
    {
      $bankTotals[$amount['name']] += $amount['amount'];
    }
    

    在此之后,$bankTotals 是一个以银行名称为索引的数组,其中包含银行总金额的值。您可以从此处按照您认为合适的方式使用此数组。

    可能有用的是另一个 foreach 循环将其全部打印出来:

    foreach($bankTotals as $name => $amount)
    {
      echo $name.".....".$amount."\n";
    }
    

    【讨论】:

    • 谢谢 JGB146 我已经编写了将近 3 天的脚本没有任何结果...现在解决了!
    • @Jeffrey Blake,如果我们有两个要合并的键怎么办。假设银行名称和银行地址,只有名称和地址相同时才会计算金额...实际上现在有这些问题...请帮助
    【解决方案2】:
    <?php
    
    // array of bank structure
    $banks = array();
    $banks[] = array('name'=>'Bank BRI','amount'=>rand());
    $banks[] = array('name'=>'Bank BRI','amount'=>rand());
    $banks[] = array('name'=>'Bank BCA','amount'=>rand());
    $banks[] = array('name'=>'Bank CIMB','amount'=>rand());
    $banks[] = array('name'=>'Bank BRI','amount'=>rand());
    $banks[] = array('name'=>'Bank CIMB','amount'=>rand());
    $banks[] = array('name'=>'Bank BRI','amount'=>rand());
    $banks[] = array('name'=>'Bank BNI','amount'=>rand());
    $banks[] = array('name'=>'Bank CIMB','amount'=>rand());
    $banks[] = array('name'=>'Bank BCA','amount'=>rand());
    $banks[] = array('name'=>'Bank Mandiri','amount'=>rand());
    $banks[] = array('name'=>'Bank BCA','amount'=>rand());
    $banks[] = array('name'=>'Bank BCA','amount'=>rand());
    $banks[] = array('name'=>'Bank Permata','amount'=>rand());
    
    // begin the iteration for grouping bank name and calculate the amount
    $amount = array();
    foreach($banks as $bank) {
        $index = bank_exists($bank['name'], $amount);
        if ($index < 0) {
            $amount[] = $bank;
        }
        else {
            $amount[$index]['amount'] +=  $bank['amount'];
        }
    }
    print_r($amount); //display 
    
    // for search if a bank has been added into $amount, returns the key (index)
    function bank_exists($bankname, $array) {
        $result = -1;
        for($i=0; $i<sizeof($array); $i++) {
            if ($array[$i]['name'] == $bankname) {
                $result = $i;
                break;
            }
        }
        return $result;
    }
    

    【讨论】:

      【解决方案3】:

      我宁愿加

      $bankTotals = array();
      foreach($amountsArray as $amount)
      {
       if(isset($bankTotals[$amount['name']]))
          $bankTotals[$amount['name']] += $amount['amount'];
       else
          $bankTotals[$amount['name']] = $amount['amount'];
      }
      

      【讨论】:

        【解决方案4】:

        C# 中的示例:

        Dictionary<string,object>[] items = {
          new Dictionary<string, object> {{ "name", "Bank BRI"}, {"amount", 0 }},
          new Dictionary<string, object> {{ "name", "Bank BRI"}, {"amount", 0 }},
          new Dictionary<string, object> {{ "name", "Bank BCA"}, {"amount", 1412341234 }},
          new Dictionary<string, object> {{ "name", "Bank CIMB Niaga"}, {"amount", 532532552 }} 
        };
        
        var amounts = new Dictionary<string, int>();
        
        foreach (var item in items) {
          string bank = (string)item["name"];
          int amount = (int)item["amount"];
          if (amounts.ContainsKey(bank)) {
            amounts[bank] += amount;
          } else {
            amounts.Add(bank, amount);
          }
        }
        
        foreach (var amount in amounts) {
          Console.WriteLine("{0}: {1}", amount.Key, amount.Value);
        }
        

        【讨论】:

        • 谢谢,我会尝试用 PHP 实现你的脚本。
        • 我的脚本卡住了...我仍在尝试将您的 C# 转换为 PHP。任何想法?谢谢。
        • 无需转换 Guffa 的脚本 JGB146 响应几乎是一样的。
        【解决方案5】:

        @Shubham 的循环是一种完全合适的技术。

        如果您愿意,不妨使用array_reduce()

        • 避免生成全局范围的变量或
        • 想要使用返回值或
        • 一般更喜欢实用风格

        null 合并运算符可防止生成任何警告/错误以添加到结果数组中尚未声明的元素中

        代码:(Demo)

        var_export(
            array_reduce(
                $array,
                function($carry, $row) {
                    $carry[$row['name']] = ($carry[$row['name']] ?? 0) + $row['amount'];
                    return $carry;
                }
            )
        );
        

        输出:

        array (
          'Bank BRI' => 34534534,
          'Bank BCA' => 1435773657,
          'Bank CIMB Niaga' => 1338303418,
          'Bank BNI' => 124124,
          'Bank Mandiri' => 0,
          'Bank Permata' => 352352353,
        )
        

        【讨论】:

          【解决方案6】:
          $a = arrayofindonesianbanks;
          
          foreach ($a as $anarrays) {
                  echo "$anarrays[name]."  ".$anarrays[amount]";
              }
          }
          

          在 php 中查看 foreach。

          【讨论】:

          • 非常感谢,我正在尝试将 GUFFA 算法转换为 PHP。但我仍然卡住/困惑。
          猜你喜欢
          • 2014-10-20
          • 1970-01-01
          • 2021-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-21
          • 1970-01-01
          相关资源
          最近更新 更多