Как я могу получить сумму значений массива, которые соответствуют друг другу? - PullRequest
0 голосов
/ 17 июня 2020

По определенным причинам я не буду делать это в запросе SQL, хотя кажется, что это имеет смысл. Я хотел бы манипулировать этими данными в PHP.

Я вывожу результаты, используя PHP, в файл CSV. Эти результаты CSV выглядят так:

Event Date          Client      Event Type      Location        Player      Pay      Total
2020/05/30 7:00 PM  Erin        Public Event    Effingham       Davy T      10
2020/05/01 9:00 PM  Mike        Fundraiser      Lakewood        Greg P      100
2020/06/13 1:30 AM  Jeff        Wedding         Lakewood        Greg P      60
2020/05/30 7:00 PM  Erin        Public Event    Effingham       Katrina N   0
2020/05/01 9:00 PM  Mike        Fundraiser      Lakewood        Michael S   400
2020/06/12 1:30 AM  Jeff        Wedding         Lakewood        Michael S   50
2020/06/13 1:30 AM  Jeff        Wedding         Lakewood        Michael S   61
2020/03/14 5:00 PM  Kimberly    Corporate       Aurora          Robert D    12.5
2020/05/01 9:00 PM  Mike        Fundraiser      Lakewood        Robert D    450
2020/05/30 7:00 PM  Erin        Public Event    Effingham       Robert D    0
2020/06/12 1:30 AM  Jeff        Wedding         Lakewood        Robert D    51

Я хочу суммировать значения, в которых совпадают имена, чтобы это выглядело так:

Event Date          Client      Event Type      Location        Player      Pay      Total
2020/05/30 7:00 PM  Erin        Public Event    Effingham       Davy T      10       10
2020/05/01 9:00 PM  Mike        Fundraiser      Lakewood        Greg P      100      160
2020/06/13 1:30 AM  Jeff        Wedding         Lakewood        Greg P      60       160
2020/05/30 7:00 PM  Erin        Public Event    Effingham       Katrina N   0        0
2020/05/01 9:00 PM  Mike        Fundraiser      Lakewood        Michael S   400      511
2020/06/12 1:30 AM  Jeff        Wedding         Lakewood        Michael S   50       511
2020/06/13 1:30 AM  Jeff        Wedding         Lakewood        Michael S   61       511 
2020/03/14 5:00 PM  Kimberly    Corporate       Aurora          Robert D    12.5     513.5
2020/05/01 9:00 PM  Mike        Fundraiser      Lakewood        Robert D    450      513.5
2020/05/30 7:00 PM  Erin        Public Event    Effingham       Robert D    0        513.5
2020/06/12 1:30 AM  Jeff        Wedding         Lakewood        Robert D    51       513.5

Мой текущий PHP код для вывода запроса:

$csv_output = '"'.implode('","',array_keys($results[0])).'",Total'."\n";;


  foreach ($results as $row) {
    print_r($row);
    $csv_output .= '"'.implode('","',$row).'",'."\n";
  }

Вот пример вывода массива путем добавления print_r в foreach l oop:

Array
(
    [Event Date] => 2020/02/21 05:00 PM
    [Client] => Jeff
    [Event Type] => Wedding
    [Location] => Lakewood
    [Player] => Greg P
    [Pay] => 60
)
Array
(
    [Event Date] => 2020/05/30 07:00 PM
    [Client] => Erin
    [Event Type] => Public Event
    [Location] => Effingham
    [Player] => Davy
    [Pay] => 10
)
Array
(
    [Event Date] => 2020/05/01 09:00 PM
    [Client] => Mike
    [Event Type] => Fundraiser
    [Location] => Lakewood
    [Player] => Greg
    [Pay] => 100
)

Как я могу собрать сумму суммы 'Pay' и поместите это в общие поля, где значения массива совпадают друг с другом, как показано в желаемом выводе csv выше?

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Вы должны перебрать массив дважды. Сначала для подсчета сумм выплат, а затем для создания нового элемента массива.

$players = [
    [
        'Player' => 'Greg P',
        'Pay' => 60
    ],
    [
        'Player' => 'Greg P',
        'Pay' => 10
    ],
    [
        'Player' => 'Davy',
        'Pay' => 60
    ]
];

$pays = [];

foreach ($players as $player) {
    $pays[$player['Player']] = ($pays[$player['Player']] ?? 0) + $player['Pay'];
}

foreach (array_keys($players) as $playerKey) {
    $players[$playerKey]['Total'] = $pays[$players[$playerKey]['Player']];
}

Вывод для моего примера:

Array
(
    [0] => Array
        (
            [Player] => Greg P
            [Pay] => 60
            [Total] => 70
        )

    [1] => Array
        (
            [Player] => Greg P
            [Pay] => 10
            [Total] => 70
        )

    [2] => Array
        (
            [Player] => Davy
            [Pay] => 60
            [Total] => 60
        )

)
0 голосов
/ 17 июня 2020

Вы можете рассчитать сумму для каждого клиента, используя array_walk и второй массив как [Client => Sum]

<?php

$array = [
    [
        'Client' => 'x',
        'Pay' => 1
    ],
    [
        'Client' => 'y',
        'Pay' => 1
    ],
    [
        'Client' => 'x',
        'Pay' => 5
    ]
];

$tempValues = [];

array_walk($array, function($row) use (&$tempValues) {
    if (!isset($tempValues[$row['Client']])) {
        $tempValues[$row['Client']] = 0;
    }
    $tempValues[$row['Client']] += $row['Pay'];
});

, это даст вам:

array(2) {
  ["x"]=>
  int(6)
  ["y"]=>
  int(1)
}

, а затем включает $tempValues[$row['Client']] в ваш CSV-вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...