За последние 24 часа нас посетили 27455 программистов и 1485 роботов. Сейчас ищут 1037 программистов ...

Работа с многомерным массивом(группировка,сумма)

Тема в разделе "PHP для новичков", создана пользователем osi322, 3 авг 2016.

  1. osi322

    osi322 Активный пользователь

    С нами с:
    21 май 2015
    Сообщения:
    19
    Симпатии:
    0
    Здравствуйте!
    Задача в следующем есть многомерный массив(в среднем длина его 1000) типа
    PHP:
    1. $mas[]=array('name'=>'xxx','coda'=>'aaa','codb'=>'bbb','num'=>'4','type'=>'a');
    2. $mas[]=array('name'=>'xxx','coda'=>'aaa','codb'=>'bbb','num'=>'6','type'=>'c');
    3. $mas[]=array('name'=>'yyy','coda'=>'a','codb'=>'b','num'=>'7','type'=>'c');
    Необходимо сгруппировать его если coda и codb равны, получить сумму по num и строку type-num
    Конечный результат массива
    PHP:
    1. $mas_group=..
    2.      (0) => Array
    3.         (
    4.             (name) => 'xxx',
    5.             (coda) => 'aaa',
    6.             (codb) => 'bbb',
    7.             (sum) => '10',
    8.             (group_type) => Array
    9.                                              (
    10.                                                  (0) => Array
    11.                                                         (
    12.                                                            (0) => 'a-4'
    13.                                                            (1) => 'c-6'
    14.                                                          )
    15.  
    16.                                              ),
    17.         ),
    18.  
    19.     (1) => Array
    20.         (
    21.             (name) => 'yyy',
    22.             (coda) => 'a',
    23.             (codb) => 'b',
    24.             (sum) => '7',
    25.             (group_type) => Array
    26.                                              (
    27.                                                  (0) => Array
    28.                                                         (
    29.                                                            (0) => 'c-7'
    30.                                                          )
    31.  
    32.                                              ),
    33.  
    34.         )
    Есть ли готовые функции для этого? или лучше все заливать в БД и запросом( используя SUM, GROUP_CONCAT) заполнять в массив?
    В общем какие решения есть по такой группировки, пожалуйста помогите.
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Думаю нет универсального решения. Проще самому всё сделать на циклах например.
     
  3. osi322

    osi322 Активный пользователь

    С нами с:
    21 май 2015
    Сообщения:
    19
    Симпатии:
    0
    А пример можно простой группировки по двум значениям и суммировать одинаковые, в гуле подобное не могу найти..
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @osi322 в sql или php array?
    Если второе, то просто в цикле создаёшь новый массив с нужной структурой.
    Есть конечно и разные классы, которые помогают преобразовать массивы, но они не универсальны.
    http://www.yiiframework.com/doc-2.0/guide-helper-array.html
     
  5. osi322

    osi322 Активный пользователь

    С нами с:
    21 май 2015
    Сообщения:
    19
    Симпатии:
    0
    По второму(yii еще не изучал), в чем здесь ошибка почему он затирает повторяющиеся? Что я не так понимаю..
    PHP:
    1. $masgroup=array();
    2.                     foreach ($mas as $v)
    3.                         {
    4.                             $a=0;
    5.                             $k;
    6.                             foreach ($masgroup as $key =>  $vv)
    7.                             {
    8.                                 if ($v['cada']==$vv['cada'] and $v['cadb']==$vv['cadb'])
    9.                                 {
    10.                                     $a=1;
    11.                                     $k=$key;
    12.                                     //список повторяющих
    13.                                     echo $key.$vv['name']."<br>";
    14.                                 }
    15.                             }
    16.                             //нет совпадений
    17.                             if ($a==0)
    18.                             {
    19.                                 $masgroup[]=$v;
    20.                             }
    21.                             //если совпало
    22.                             if ($a==1)
    23.                             {
    24.                                 $masgroup[$k]['kol']=$masgroup[$k]['kol']+$v['kol'];
    25.                             }
    26.                         }
     
  6. osi322

    osi322 Активный пользователь

    С нами с:
    21 май 2015
    Сообщения:
    19
    Симпатии:
    0
    А нет все нормально, лучше этого варианта ничего быть не может?
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Вариант, как вариант. По поводу yii - а не обязательно весь изучать, можно array helper выудить оттуда и использовать. Он ни от каких других классов не зависит. Я одно время так с кохановским хелпером делал.
     
    denis01 нравится это.
  8. osi322

    osi322 Активный пользователь

    С нами с:
    21 май 2015
    Сообщения:
    19
    Симпатии:
    0
    Ясно, думал может что умнее есть. Спасибо гляну, буду знаний набираться.