我需要按
SiteId
列值对二维数组中的数据进行分组,然后使用该组中的 TransactionType
值作为第二级键,需要收集组中该交易的总 Amount
。
输入:
[
['SiteID' => 147, 'Amount' => '500.00', 'TransactionType' => 'Deposit'],
['SiteID' => 147, 'Amount' => '500.00', 'TransactionType' => 'Redemption'],
['SiteID' => 147, 'Amount' => '1500.00', 'TransactionType' => 'Deposit'],
['SiteID' => 147, 'Amount' => '200.00', 'TransactionType' => 'Reload'],
['SiteID' => 150, 'Amount' => '100.00', 'TransactionType' => 'Deposit'],
['SiteID' => 3, 'Amount' => '500.00', 'TransactionType' => 'Redemption'],
['SiteID' => 150, 'Amount' => '200.00', 'TransactionType' => 'Redemption'],
['SiteID' => 3, 'Amount' => '500.00', 'TransactionType' => 'Deposit'],
['SiteID' => 3, 'Amount' => '200.00', 'TransactionType' => 'Deposit'],
['SiteID' => 3, 'Amount' => '200.00', 'TransactionType' => 'Reload'],
['SiteID' => 147, 'Amount' => '500.00', 'TransactionType' => 'Redemption']
]
期望的结果:
[
147 => ['Deposit' => 2000.0, 'Redemption' => 1000.0, 'Reload' => 200.0],
150 => ['Deposit' => 100.0, 'Redemption' => 200.0],
3 => ['Redemption' => 500.0, 'Deposit' => 700.0, 'Reload' => 200.0]
]
将来请提供工作数组片段。
$transactions = array (
array( 'SiteID' => 147, 'Amount' => '500.00', 'TransactionType' => 'Deposit' ),
array( 'SiteID' => 147, 'Amount' => '500.00', 'TransactionType' => 'Redemption'),
array( 'SiteID' => 147, 'Amount' => '1500.00', 'TransactionType' => 'Deposit' ),
array( 'SiteID' => 147, 'Amount' => '200.00', 'TransactionType' => 'Reload' ),
array( 'SiteID' => 150, 'Amount' => '100.00', 'TransactionType' => 'Deposit' ),
array( 'SiteID' => 3, 'Amount' => '500.00', 'TransactionType' => 'Redemption' ),
array( 'SiteID' => 150, 'Amount' => '200.00', 'TransactionType' => 'Redemption' ),
array( 'SiteID' => 3, 'Amount' => '500.00', 'TransactionType' => 'Deposit' ),
array( 'SiteID' => 3, 'Amount' => '200.00', 'TransactionType' => 'Deposit' ),
array( 'SiteID' => 3, 'Amount' => '200.00', 'TransactionType' => 'Reload' ),
array( 'SiteID' =>147, 'Amount' => '500.00', 'TransactionType' => 'Redemption' )
);
$totals = null;
foreach ($transactions as $t){
$amount = (float) $t['Amount'];
if (isset($totals[ $t['SiteID'] ][ $t['TransactionType'] ])){
$totals[ $t['SiteID'] ][ $t['TransactionType'] ] += (float) $amount;
} else {
$totals[ $t['SiteID'] ][ $t['TransactionType'] ] = (float) $amount;
}
}
print_r ($totals);
这将产生如下结果:
数组 ( [147] => 数组 ( [押金] => 2000 [兑换] => 1000 [重新加载] => 200 ) [150] => 数组 ( [存款] => 100 [兑换] => 200 ) [3] => 数组 ( [兑换] => 500 [押金] => 700 [重新加载] => 200 ) )
如果您可以处理 php 通知警告,则循环可以缩短为:
foreach ($transactions as $t){
$totals[ $t['SiteID'] ][ $t['TransactionType'] ] += (float) $t['Amount'];
}
在
foreach()
中使用数组解构来声明方便的变量以供以后使用。
使用 id 作为第一级键、交易类型作为第二级键、金额作为第一个遇到的值或要添加到先前遇到的元素的值,将关联值推入结果数组。
代码:(演示)
$result = [];
foreach ($array as ['SiteID' => $id, 'Amount' => $amt, 'TransactionType' => $trn]) {
$result[$id][$trn] = ($result[$id][$trn] ?? 0) + $amt;
}
var_export($result);