我已经构建了相当复杂的数组,其中包含其他带有用户邮件和“硬币”值的数组。我需要删除和计算重复的邮件并合并“硬币”值。
Array (
[0] => Array ( [mail] => [email protected] [coins] => 25000.00 )
[1] => Array ( [mail] => [email protected] [coins] => 500000.00 )
[2] => Array ( [mail] => [email protected] [coins] => 10000.00 )
[3] => Array ( [mail] => [email protected] [coins] => 10000.00 )
[4] => Array ( [mail] => [email protected] [coins] => 20000.00 )
)
所以输出看起来像:
[email protected] (2), 35000.00 coins
[email protected] (2), 510000.00 coins
[email protected] (1), 20000.00 coins
非常感谢!
$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';
}
isset()
来确定是否正在处理邮件值的第一次出现。printf()
根据需要简洁地格式化数据。如果浮点输出语法不熟悉,请阅读this。
代码:(演示)
$array = [
['mail' => '[email protected]', 'coins' => '25000.00'],
['mail' => '[email protected]', 'coins' => '500000.00'],
['mail' => '[email protected]', 'coins' => '10000.00'],
['mail' => '[email protected]', 'coins' => '10000.00'],
['mail' => '[email protected]', '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 (...)
}
输出:
[email protected] (2), 35000.00 coins
[email protected] (2), 510000.00 coins
[email protected] (1), 20000.00 coins