【问题标题】:Group rows by one column value, sum another column and count occurrences按一个列值对行进行分组,对另一列求和并计算出现次数
【发布时间】:2020-08-21 07:59:07
【问题描述】:

我已经构建了相当复杂的数组,其中包含其他包含用户邮件和“硬币”值的数组。我需要删除和计算重复的邮件并合并“硬币”值。

Array (
    [0] => Array ( [mail] => mail1@gmail.com [coins] => 25000.00 ) 
    [1] => Array ( [mail] => mail2@gmail.com [coins] => 500000.00 ) 
    [2] => Array ( [mail] => mail1@gmail.com [coins] => 10000.00 ) 
    [3] => Array ( [mail] => mail2@gmail.com [coins] => 10000.00 )
    [4] => Array ( [mail] => mail3@gmail.com [coins] => 20000.00 )
) 

所以输出看起来像:

mail1@gmail.com (2), 35000.00 coins
mail2@gmail.com (2), 510000.00 coins
mail3@gmail.com (1), 20000.00 coins

非常感谢!

【问题讨论】:

  • 由于这个问题没有显示任何研究成果,我采取了适当的行动方案并否决了这个问题。
  • SO 是一个问答网站,而不是代码工厂或“完成你的作业”。请先自己尝试,然后询问您是否遇到错误。

标签: php arrays merge duplicates


【解决方案1】:
  1. 通过将临时关联键(邮件值)分配给新的结果数组来对数据进行分组。
  2. 在迭代时,通过在结果数组的 mail 键上调用 isset() 来确定您是否正在处理第一次出现的邮件值。
  3. 如果这是邮件的第一个实例,请设置子数组中的所有值。
  4. 如果这不是邮件值的第一个实例,请调整预先存在的子数组。
  5. 循环后,使用printf() 来根据需要简洁地格式化您的数据。

如果浮点输出语法不熟悉,请阅读this

代码:(Demo)

$array = [
    ['mail' => 'mail1@example.com', 'coins' => '25000.00'],
    ['mail' => 'mail2@example.com', 'coins' => '500000.00'],
    ['mail' => 'mail1@example.com', 'coins' => '10000.00'],
    ['mail' => 'mail2@example.com', 'coins' => '10000.00'],
    ['mail' => 'mail3@example.com', 'coins' => '20000.00'],
];

$result = [];
foreach ($array as ['mail' => $mail, 'coins' => $coins]) {
    if (!isset($result[$mail])) {
        $result[$mail] = [1, $coins];  // declare the data for the first instance of mail
    } else {
        ++$result[$mail][0];          // increment the running count
        $result[$mail][1] += $coins;  // add coins to running total
    }
}

foreach ($result as $mail => $row) {
    printf("%s (%d), %.2f coins\n", $mail, ...$row);  // unpack the row with the splat operator (...)
}

输出:

mail1@example.com (2), 35000.00 coins
mail2@example.com (2), 510000.00 coins
mail3@example.com (1), 20000.00 coins

【讨论】:

    【解决方案2】:
    $grouped = [];
    foreach ($array as $item) {
        $email = $item['mail'];
        if (empty($grouped[$email])) {
            $grouped[$email] = ['count' => 0, 'sum' => 0];
        }
    
        $grouped[$email]['count']++;
        $grouped[$email]['sum'] += $item['coins'];
    }
    
    foreach ($grouped as $email => $data) {
        echo $email . '(' . $data['count'] . ') ' . $data['sum'] . ' coins';
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-20
      • 1970-01-01
      • 2019-12-08
      • 2021-08-11
      • 2021-07-25
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      相关资源
      最近更新 更多