Просуммировать значения в массиве объектов

Дан массив $animals вида

array(4) {
  [0]=>
  object(Chicken)#2 (3) {
    ["id"]=>
    int(1)
    ["egg"]=>
    int(0)
    ["typeProduct"]=>
    string(8) "Яица"
  }
  [1]=>
  object(Cow)#3 (3) {
    ["id"]=>
    int(2)
    ["milk"]=>
    int(10)
    ["typeProduct"]=>
    string(12) "Молоко"
  }
  [2]=>
  object(Chicken)#4 (3) {
    ["id"]=>
    int(3)
    ["egg"]=>
    int(0)
    ["typeProduct"]=>
    string(8) "Яица"
  }
  [3]=>
  object(Cow)#5 (3) {
    ["id"]=>
    int(4)
    ["milk"]=>
    int(9)
    ["typeProduct"]=>
    string(12) "Молоко"
  }

Нужно преобразовать его так, чтобы он подсчитывал кол-во продукта.

Пример

array('Молоко' => 19, 'Яица' => 0)

Ответы (1 шт):

Автор решения: Slava Rozhnev

Используем функцию array_reduce

$result = array_reduce(
    $data,
    function($acc, $el) {
        // преобразуем объект в массив
        $el = (array)$el;

        if (!isset($acc[$el['typeProduct']])) $acc[$el['typeProduct']] = 0;

        $acc[$el['typeProduct']] += $el[array_keys($el)[1]];
        return $acc;
    },
    []
);

Execute PHP online

→ Ссылка