PHP Sum Like Elements - PullRequest
       7

PHP Sum Like Elements

0 голосов
/ 04 января 2019

У меня есть массив PHP, я хотел бы суммировать все значения для каждого повторяющегося элемента, а затем вернуть только один окончательный массив с итоговой суммой ... Вот пример массива

[0] => Array
    (
        [purchase_amount] => 5000.00
        [listing_price] => 5000.00
        [home_warranty_cost] => 10.00
        [emd] => 100.00
        [fee] => 10.00
    )

[1] => Array
    (
        [purchase_amount] => 0.00
        [listing_price] => 0.00
        [home_warranty_cost] => 10.00
        [emd] => 100.00
        [fee] => 10.00
    )

[2] => Array
    (
        [purchase_amount] => 15000.00
        [listing_price] => 15000.00
        [home_warranty_cost] => 10.00
        [emd] => 100.00
        [fee] => 10.00
    )

И я хотел бы просто иметь это в конце ...

    (
        [purchase_amount] => 20000.00
        [listing_price] => 20000.00
        [home_warranty_cost] => 30.00
        [earnest_money_amount] => 300.00
        [tc_fee] => 30.00
    )

Есть ли простая функция для этого или мне нужно написать цикл for?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Подходит для array_reduce [ doc ], который работает независимо от ваших имен ключей.

Функция обратного вызова для array_reduce применяется к каждому элементу входного массива и принимает аккумулятор $carry и текущий элемент $item. Если аккумулятор равен нулю, это первый элемент в процессе сокращения, поэтому мы можем сделать прямое назначение. В противном случае циклически переберите записи текущего элемента и добавьте значения в аккумулятор.

array_reduce($data, function ($carry, $item) {
   if (!$carry) {
      $carry = $item;
   }  
   else {
      foreach ($item as $k => $v) {
          $carry[$k] += $v;
      }
   }

   return $carry;
});

Результат:

Array
(
    [purchase_amount] => 20000
    [listing_price] => 20000
    [home_warranty_cost] => 30
    [emd] => 300
    [fee] => 30
)

Попробуйте!

0 голосов
/ 04 января 2019

Я бы сделал что-то подобное. Все еще есть одна петля над ключами, но это необходимо, чтобы не перечислять все поля каждый раз ...

$sums = array_reduce($data, function ($carry, $item) {
    foreach ($item as $key => $value)
    {
        $carry[$key] = array_key_exists($key, $carry) ? $carry[$key] + $item[$key] : 0;
    }

    return $carry;
}, []);

Рабочий пример здесь.

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