对二维数组中的行数据进行透视,按一列进行分组,并对相对于透视列的另一列进行求和

问题描述 投票:0回答:2

我需要按

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]
]
php arrays multidimensional-array sum pivot
2个回答
2
投票

将来请提供工作数组片段。

$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'];
}

0
投票

foreach()
中使用数组解构来声明方便的变量以供以后使用。

使用 id 作为第一级键、交易类型作为第二级键、金额作为第一个遇到的值或要添加到先前遇到的元素的值,将关联值推入结果数组。

代码:(演示

$result = [];
foreach ($array as ['SiteID' => $id, 'Amount' => $amt, 'TransactionType' => $trn]) {
    $result[$id][$trn] = ($result[$id][$trn] ?? 0) + $amt;
}
var_export($result);
© www.soinside.com 2019 - 2024. All rights reserved.