Уменьшить массивы внутри массива объекта - PullRequest
0 голосов
/ 29 мая 2018

У меня есть этот массив:

Collection {#319 ▼
  #items: array:6 [▼
    "Seccion 1 Pregunta 1" => array:3 [▼
      "satisfactory" => 2
      "unsatisfactory" => 0
      "total" => 2
    ]
    "Seccion 1 Pregunta 2" => array:3 [▼
      "satisfactory" => 2
      "unsatisfactory" => 0
      "total" => 2
    ]
    "Seccion 1 pregunta 3" => array:3 [▼
      "satisfactory" => 0
      "unsatisfactory" => 1
      "total" => 1
    ]
    "Seccion 2 pregunta 1" => array:3 [▼
      "satisfactory" => 3
      "unsatisfactory" => 0
      "total" => 3
    ]
    "Seccion 2 pregunta 2" => array:3 [▼
      "satisfactory" => 1
      "unsatisfactory" => 1
      "total" => 2
    ]
    "Commentarios seccion 2" => array:3 [▼
      "satisfactory" => 0
      "unsatisfactory" => 0
      "total" => 0
    ]
  ]
}

И я хотел бы получить сумму всех удовлетворительных, неудовлетворительных и итоговых значений.Что-то вроде:

Collection {#319 ▼
    #items: array:3 [▼
          "satisfactory" => 8
          "unsatisfactory" => 2
          "total" => 10
    ]
}

Ответы [ 4 ]

0 голосов
/ 29 мая 2018

Вы также можете использовать array_reduce и передать массив с ключами и значениями, установленными на 0, в качестве начального значения.

$result = array_reduce($arrays, function($carry, $item){
    $carry["satisfactory"] += $item["satisfactory"];
    $carry["unsatisfactory"] += $item["unsatisfactory"];
    $carry["total"] += $item["total"];
    return $carry;
}, ["satisfactory" => 0, "unsatisfactory" => 0, "total" => 0]);

print_r($result);

Это даст вам:

Array
(
    [satisfactory] => 8
    [unsatisfactory] => 2
    [total] => 10
)
0 голосов
/ 29 мая 2018

Вы можете использовать array_walk:

$data = [
"Seccion 1 Pregunta 1" => [
  "satisfactory" => 2,
  "unsatisfactory" => 0,
  "total" => 2
],
"Seccion 1 Pregunta 2" => [
  "satisfactory" => 2,
  "unsatisfactory" => 0,
  "total" => 2
],
"Seccion 1 pregunta 3" => [
  "satisfactory" => 0,
  "unsatisfactory" => 1,
  "total" => 1
],
"Seccion 2 pregunta 1" => [
  "satisfactory" => 3,
  "unsatisfactory" => 0,
  "total" => 3
],
"Seccion 2 pregunta 2" => [
  "satisfactory" => 1,
  "unsatisfactory" => 1,
  "total" => 2
],
"Commentarios seccion 2" => [
  "satisfactory" => 0,
  "unsatisfactory" => 0,
  "total" => 0
]
];

$total = array('satisfactory' => 0, 'unsatisfactory' => 0, 'total' => 0);

array_walk($data, function($v) use (&$total) {
   $total['satisfactory'] += $v['satisfactory'];
    $total['unsatisfactory'] += $v['unsatisfactory'];
    $total['total'] += $v['total'];
});
0 голосов
/ 29 мая 2018

Если вы знаете, какие ключи вам нужны, просто выполните:

[
    'satisfactory'   => $collection->sum('satisfactory'),
    'unsatisfactory' => $collection->sum('unsatisfactory'),
    'total'          => $collection->sum('total')
]

Если вы не уверены, какими будут ключи, выполните цикл над ключами первого элемента, чтобы создать массив, аналогичный приведенному выше.,Если вам нужно это как коллекция, просто сделайте:

$newCollection = collect( ... array from above ... );
0 голосов
/ 29 мая 2018

Вы можете попробовать что-то вроде:

$totals = array();
foreach($array as $key => $val) {
    $totals[$key] += $val;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...