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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Преобразование массива и суммирование

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Noobster
Отправлено: 01 Августа, 2019 - 13:47:40
Post Id



Новичок


Покинул форум
Сообщений всего: 29
Дата рег-ции: Авг. 2018  


Помог: 0 раз(а)




Имеется массив, который нужен преобразовать в массив чтобы сгруппировать по 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. )
 
 Top
MouseZver
Отправлено: 02 Августа, 2019 - 19:27:06
Post Id



Новичок


Покинул форум
Сообщений всего: 58
Дата рег-ции: Июнь 2017  
Откуда: php.ru


Помог: 1 раз(а)




цикл foreach + new var = []
 
 Top
Noobster
Отправлено: 02 Августа, 2019 - 20:29:50
Post Id



Новичок


Покинул форум
Сообщений всего: 29
Дата рег-ции: Авг. 2018  


Помог: 0 раз(а)




Да, во пробую, понимаю что криво, но всё же.

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


Update: Я привёл только часть массива, он содержит на много больше ключей.

(Отредактировано автором: 02 Августа, 2019 - 21:15:34)

 
 Top
Noobster
Отправлено: 04 Августа, 2019 - 17:41:29
Post Id



Новичок


Покинул форум
Сообщений всего: 29
Дата рег-ции: Авг. 2018  


Помог: 0 раз(а)




Please Help Огорчение Не понял
 
 Top
armancho7777777 Супермодератор
Отправлено: 05 Августа, 2019 - 01:48:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




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. }
 
 Top
LIME
Отправлено: 05 Августа, 2019 - 14:30:15
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




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 можно получше написать
(Добавление)
Хотя тогда наверное и агрегировать тоже будет можно

(Отредактировано автором: 05 Августа, 2019 - 14:32:55)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB