Удаление дубликатов и объединение значений массивов в массиве - PullRequest
0 голосов
/ 06 мая 2020

Я построил довольно сложный массив, содержащий другие массивы с пользовательскими почтовыми ящиками и значениями «монет». Мне нужно удалить и подсчитать повторяющиеся письма и объединить значения «монет».

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

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 06 мая 2020
$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';
}
0 голосов
/ 06 мая 2020
  1. Сгруппируйте данные, назначив временные ассоциативные ключи (значения почты) новому массиву результатов.
  2. Во время итерации определите, обрабатываете ли вы первое вхождение значения почты или нет, позвонив isset() в почтовом ключе результирующего массива.
  3. Если это первый экземпляр письма, установите все значения в подмассиве.
  4. Если это не первый экземпляр значение mail, отрегулируйте уже существующий подмассив.
  5. После цикла используйте printf() для краткого форматирования ваших данных по желанию.

Если синтаксис вывода с плавающей запятой неизвестен, прочитайте это .

Код: ( Демо )

$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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...