簡體   English   中英

在一列上對數組數據進行分組,並對另一列中的數據求和

[英]Group array data on one column and sum data from another column

我的數組數據如下所示:

$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,
)

因此,首先您需要$amountsArray以某種方式分配您列出的值。 然后:

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

輸出:(演示

Warning: Undefined array key "Bank BRI"

Warning: Undefined array key "Bank BCA"

Warning: Undefined array key "Bank CIMB Niaga"

Warning: Undefined array key "Bank BNI"

Warning: Undefined array key "Bank Mandiri"

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

在此之后, $bankTotals是一個以銀行名稱為索引的數組,其中包含銀行總金額的值。 您可以從此處按照您認為合適的方式使用此數組。

可能有用的一件事是另一個foreach循環將其全部打印出來:

foreach($bankTotals as $name => $amount)
{
  echo $name.".....".$amount."\n";
}
<?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;
}

我寧願添加

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

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);
}

@Shubham 的循環是一種非常合適的技術。

如果您願意,您可能希望使用array_reduce()

  • 避免生成全局范圍的變量或
  • 想要使用返回值或
  • 通常更喜歡功能風格

空合並運算符可防止生成任何警告/錯誤以添加到結果數組中尚未聲明的元素

代碼:(演示

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

或者來自 PHP7.4 的箭頭函數語法:( Demo )

var_export(
    array_reduce(
        $array,
        fn($carry, $row) => array_merge($carry, [$row['name'] => ($carry[$row['name']] ?? 0) + $row['amount']]),
        []
    )
);

輸出:

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

foreach ($a as $anarrays) {
        echo "$anarrays[name]."  ".$anarrays[amount]";
    }
}

見 php 中的 foreach。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM