Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Преобразование массива и суммирование
Форумы портала PHP.SU » » Вопросы новичков » Преобразование массива и суммирование

Страниц (1): [1]
 

1. Noobster - 01 Августа, 2019 - 13:47:40 - перейти к сообщению
Имеется массив, который нужен преобразовать в массив чтобы сгруппировать по cat_id с суммированием amount

PHP:
скопировать код в буфер обмена
  1. (
  2. [0] => Array
  3.         (
  4.                 [id] => 722
  5.                 [cat_id] => 1
  6.                 [amount] => 20
  7.         )
  8.  
  9. [1] => Array
  10.         (
  11.                 [id] => 721
  12.                 [cat_id] => 2
  13.                 [amount] => 120
  14.         )
  15.  
  16. [2] => Array
  17.         (
  18.                 [id] => 720
  19.                 [cat_id] => 2
  20.                 [amount] => 30
  21.         )
  22.  
  23. [3] => Array
  24.         (
  25.                 [id] => 719
  26.                 [cat_id] => 1
  27.                 [amount] => 70
  28.         )
  29.  
  30. [4] => Array
  31.         (
  32.                 [id] => 718
  33.                 [cat_id] => 3
  34.                 [amount] => 20
  35.         )
  36.  
  37. [5] => Array
  38.         (
  39.                 [id] => 717
  40.                 [cat_id] => 3
  41.                 [amount] => 20
  42.         )
  43. )


Должно быть примерно такое:

PHP:
скопировать код в буфер обмена
  1. (
  2. [0] => Array
  3.         (
  4.                 [cat_id] => 1
  5.                 [amount_sum] => 90
  6.         )
  7.  
  8. [1] => Array
  9.         (
  10.                 [cat_id] => 2
  11.                 [amount_sum] => 150
  12.         )
  13.  
  14. [2] => Array
  15.         (
  16.                 [cat_id] => 3
  17.                 [amount_sum] => 40
  18.         )
  19. )
  20. )
2. MouseZver - 02 Августа, 2019 - 19:27:06 - перейти к сообщению
цикл foreach + new var = []
3. Noobster - 02 Августа, 2019 - 20:29:50 - перейти к сообщению
Да, во пробую, понимаю что криво, но всё же.

PHP:
скопировать код в буфер обмена
  1. $break = [];
  2. foreach ($array as $value => $key){
  3.     $break[$key['cat_id']] += $value['amount'];
  4. }


Update: Я привёл только часть массива, он содержит на много больше ключей.
4. Noobster - 04 Августа, 2019 - 17:41:29 - перейти к сообщению
Please Help Огорчение Не понял
5. armancho7777777 - 05 Августа, 2019 - 01:48:34 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $result = [];
  2. foreach ($arr as $data){
  3.     if(!isset($result[$data['cat_id']])){
  4.         $result[$data['cat_id']] = 0;
  5.     }
  6.     $result[$data['cat_id']] += $data['amount'];
  7. }
6. LIME - 05 Августа, 2019 - 14:30:15 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. // допускаем что cat_id не может быть 0
  2. $result = $links = [];
  3. $i = 0;
  4. foreach ($arr as $data) {
  5.     $catId = $data['cat_id'] ?? 0; //соберем сломанные элементы в 0
  6.     if (!isset($links[$catId])) {
  7.         $result[] = ['cat_id' => $catId, 'amount_sum' => 0];
  8.         $links[$catId] = &$result[$i++];
  9.     }
  10.     $links[$catId]['amount_sum'] += $data['amount'] ?? 0;
  11. }
  12. var_dump($result);

(Добавление)
Если данные можно получить отсортированными по cat_id можно получше написать
(Добавление)
Хотя тогда наверное и агрегировать тоже будет можно

 

Powered by ExBB FM 1.0 RC1