Как обработать многомерный ассоциативный массив

Scratches

Добрый день!
Подскажите пожалуйста как обработать массив данных, а именно обойти массив и объединить повторяющиеся значения по 2м ключам [domain] и [f_country], по следующему ключу [cms] объединить массивы и по последнему ключу [count_id] просуммировать значения?

Для понимания привожу таблицу для которой я это делаю.
upload_2021-7-7_1-8-11.png

Текущий код:

PHP:
  1. (
  2.     [0] => Array
  3.         (
  4.             [domain] => .com
  5.             [f_country] => Международный (коммерция)
  6.             [cms] => Array
  7.                 (
  8.                     [0] => WordPress
  9.                     [1] => 1801
  10.                 )
  11.  
  12.             [count_id] => 1801
  13.         )
  14.  
  15.     [1] => Array
  16.         (
  17.             [domain] => .com
  18.             [f_country] => Международный (коммерция)
  19.             [cms] => Array
  20.                 (
  21.                     [0] => DLE
  22.                     [1] => 25
  23.                 )
  24.  
  25.             [count_id] => 25
  26.         )
  27.  
  28.     [2] => Array
  29.         (
  30.             [domain] => .de
  31.             [f_country] => Германия
  32.             [cms] => Array
  33.                 (
  34.                     [0] => WordPress
  35.                     [1] => 313
  36.                 )
  37.  
  38.             [count_id] => 313
  39.         )
  40. )

Что хочу получить:

PHP:
  1. (
  2.     [0] => Array
  3.         (
  4.             [domain] => .com
  5.             [f_country] => Международный (коммерция)
  6.             [cms] => Array
  7.             (
  8.                 [0] => Array
  9.                 (
  10.                     [0] => WordPress
  11.                     [1] => 1801
  12.                 )
  13.                 [1] => Array
  14.                 (
  15.                     [0] => DLE
  16.                     [1] => 25
  17.                 )
  18.             )
  19.             [count_id] => 1826
  20.         )
  21.  
  22.     [1] => Array
  23.         (
  24.             [domain] => .de
  25.             [f_country] => Германия
  26.             [cms] => Array
  27.                 (
  28.                     [0] => WordPress
  29.                     [1] => 313
  30.                 )
  31.  
  32.             [count_id] => 313
  33.         )
  34. )
 

Drunkenmunky

Создайте новый массив.
Запустите в цикл исходный массив.
Извлекайте ключ, по которому хотите что-то просуммировать.
Если в новом массиве такого ключа нет, то добавляйте новый элемент с извлеченным ключом.
Если такой ключ есть в новом массиве, то к нужным значениям его элементов добавляйте значения текущего.
P.S. Если нужен примерный код, то предоставьте массив в таком виде, в котором его не нужно дополнительно править после copypaste

 

Scratches

Всем спасибо. В итоге решил просто делать 2 запроса к базе и сравнивать 2 массива.

Если вдруг у кого будут подобные вопросы, прикладываю код:

PHP:
  1. $select_row = $db->query(«SELECT `cms`,`domain`, COUNT(*) AS count_cms FROM prs_cmssites
  2. GROUP BY cms,domain ORDER BY count_cms DESC»);
  3.  
  4. if ($select_row->num_rows > 0) {
  5.     while ($ras = $select_row->fetch_assoc()) {
  6.         $arrcms[] = $ras;
  7.     }
  8. }
  9.  
  10. $select_row2 = $db->query(«SELECT `domain`, `f_country`, COUNT(*) AS count_id
  11. FROM prs_cmssites,prs_flags WHERE prs_cmssites.domain=prs_flags.f_domain
  12. GROUP BY domain ORDER BY count_id DESC LIMIT 10″);
  13.  
  14. if ($select_row2->num_rows > 0) {
  15.     while ($row = $select_row2->fetch_assoc()) {
  16.         $allarray[] = $row;
  17.     }
  18.  
  19.     foreach ($allarray as $key=>$value) {
  20.         $allarray[$key][‘cms’] = array();
  21.         foreach ($arrcms as $key2=>$value2) {
  22.             if ($allarray[$key][‘domain’] == $arrcms[$key2][‘domain’]) {
  23.                $allarray[$key][‘cms’][$arrcms[$key2][‘cms’]] = $arrcms[$key2][‘count_cms’];
  24.             }
  25.         }
  26.     }
  27.     echo ‘<pre>’;
  28.     print_r($allarray);
  29.     echo ‘</pre>’;
  30. ;
  31. } else {
  32.     echo ‘Нет данных’;
  33. }

Итог:

Код (Text):
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [domain] => .com
  6.             [f_country] => Международный (коммерция)
  7.             [count_id] => 2435
  8.             [cms] => Array
  9.                 (
  10.                     [Wordpress] => 2427
  11.                     [DataLife Engine] => 8
  12.                 )
  13.  
  14.         )
  15.  
  16.     [1] => Array
  17.         (
  18.             [domain] => .org
  19.             [f_country] => Международный (организации)
  20.             [count_id] => 864
  21.             [cms] => Array
  22.                 (
  23.                     [Wordpress] => 864
  24.                 )
  25.  
  26.         )
  27. )
 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *