За последние 24 часа нас посетили 38513 программистов и 8133 робота. Сейчас ищут 1680 программистов ...

Группировка массива

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 13 фев 2023.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Имеется массив

    PHP:
    1. $arr = [
    2.                     ['id' => 1, 'title' => 'aa1', 'category_id' => 1],
    3.                     ['id' => 2, 'title' => 'aa2', 'category_id' => 1],
    4.                     ['id' => 3, 'title' => 'aa3', 'category_id' => 1],
    5.                     ['id' => 4, 'title' => 'aa4', 'category_id' => 2],
    6.                     ['id' => 5, 'title' => 'aa5', 'category_id' => 2],
    7.                     ['id' => 6, 'title' => 'aa6', 'category_id' => 3],
    8.                     ['id' => 7, 'title' => 'aa7', 'category_id' => 3],
    9.                     ['id' => 8, 'title' => 'aa8', 'category_id' => 3],
    10.                     ['id' => 9, 'title' => 'aa9', 'category_id' => 3],
    11.                 ];
    Нужно разбить его на группы по категориям, что бы получился такой

    PHP:
    1. $arr2 = [
    2.                             ['category_id1' => [
    3.                                 ['id' => 1, 'title' => 'aa1', 'category_id' => 1],
    4.                                 ['id' => 2, 'title' => 'aa2', 'category_id' => 1],
    5.                                 ['id' => 3, 'title' => 'aa3', 'category_id' => 1],
    6.                                                 ]
    7.                             ],
    8.                             ['category_id2' => [
    9.                                  ['id' => 4, 'title' => 'aa4', 'category_id' => 2],
    10.                                  ['id' => 5, 'title' => 'aa5', 'category_id' => 2],
    11.                                                        ]
    12.                                    ],
    13.                            
    14.                             ['category_id3' => [
    15.                                 ['id' => 6, 'title' => 'aa6', 'category_id' => 3],
    16.                                 ['id' => 7, 'title' => 'aa7', 'category_id' => 3],
    17.                                 ['id' => 8, 'title' => 'aa8', 'category_id' => 3],
    18.                                 ['id' => 9, 'title' => 'aa9', 'category_id' => 3],
    19.                                                 ]
    20.                             ],
    21.                            
    22.                 ];
    Я это сделал таким способом

    PHP:
    1.                 $newArr = [];
    2.                
    3.                 $key;
    4.                
    5.                 foreach($arr as $val){
    6.                     $key = $val['category_id'];
    7.                     if(!array_key_exists($key, $newArr)){
    8.                         $newArr[$key] = [$val];
    9.                     }
    10.                     else if(array_key_exists($key, $newArr)){
    11.                         array_push($newArr[$key], $val);
    12.                     }
    13.                 }
    Есть ли какая-нибудь готовая функция?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    753
    Адрес:
    Татарстан
    Готовой нет для массивов, для коллекций в симфони есть
     
  3. rr33rr

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

    С нами с:
    6 май 2021
    Сообщения:
    35
    Симпатии:
    18
    Можно проще:
    PHP:
    1. foreach($arr as &$val){
    2.   $newArr[$val['category_id']][] = $val;
    3. }
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    PHP:
    1. <?php
    2.  
    3. function fetch_group_all( array $array, string $column ): iterable
    4. {
    5.     $all = [];
    6.    
    7.     foreach ( $array AS $row )
    8.     {
    9.         $all[ ( isset ( $row[$column] ) || array_key_exists ( $column, $row ) ? $row[$column] : reset ( $row ) ) ][] = $row;
    10.     }
    11.    
    12.     return $all;
    13. }
    14.  
    15.  
    16. $arr = [
    17.     ['id' => 1, 'title' => 'aa1', 'category_id' => 1],
    18.     ['id' => 2, 'title' => 'aa2', 'category_id' => 1],
    19.     ['id' => 3, 'title' => 'aa3', 'category_id' => 1],
    20.     ['id' => 4, 'title' => 'aa4', 'category_id' => 2],
    21.     ['id' => 5, 'title' => 'aa5', 'category_id' => 2],
    22.     ['id' => 6, 'title' => 'aa6', 'category_id' => 3],
    23.     ['id' => 7, 'title' => 'aa7', 'category_id' => 3],
    24.     ['id' => 8, 'title' => 'aa8', 'category_id' => 3],
    25.     ['id' => 9, 'title' => 'aa9', 'category_id' => 3],
    26. ];
    27.  
    28. print_r ( fetch_group_all( $arr, 'category_id' ) );

    PHP:
    1. (
    2.     [1] => Array
    3.         (
    4.             [0] => Array
    5.                 (
    6.                     [id] => 1
    7.                     [title] => aa1
    8.                     [category_id] => 1
    9.                 )
    10.  
    11.             [1] => Array
    12.                 (
    13.                     [id] => 2
    14.                     [title] => aa2
    15.                     [category_id] => 1
    16.                 )
    17.  
    18.             [2] => Array
    19.                 (
    20.                     [id] => 3
    21.                     [title] => aa3
    22.                     [category_id] => 1
    23.                 )
    24.  
    25.         )
    26.  
    27.     [2] => Array
    28.         (
    29.             [0] => Array
    30.                 (
    31.                     [id] => 4
    32.                     [title] => aa4
    33.                     [category_id] => 2
    34.                 )
    35.  
    36.             [1] => Array
    37.                 (
    38.                     [id] => 5
    39.                     [title] => aa5
    40.                     [category_id] => 2
    41.                 )
    42.  
    43.         )
    44.  
    45.     [3] => Array
    46.         (
    47.             [0] => Array
    48.                 (
    49.                     [id] => 6
    50.                     [title] => aa6
    51.                     [category_id] => 3
    52.                 )
    53.  
    54.             [1] => Array
    55.                 (
    56.                     [id] => 7
    57.                     [title] => aa7
    58.                     [category_id] => 3
    59.                 )
    60.  
    61.             [2] => Array
    62.                 (
    63.                     [id] => 8
    64.                     [title] => aa8
    65.                     [category_id] => 3
    66.                 )
    67.  
    68.             [3] => Array
    69.                 (
    70.                     [id] => 9
    71.                     [title] => aa9
    72.                     [category_id] => 3
    73.                 )
    74.  
    75.         )
    76.  
    77. )
     
    Dimon2x нравится это.
  5. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    GPTChat мне такое выдал и это работает.

    PHP:
    1. $grouped = [];
    2. foreach ($arr as $item) {
    3.     $grouped[$item['category_id']][] = $item;
    4. }
     
  6. dantemgs

    dantemgs Новичок

    С нами с:
    24 дек 2022
    Сообщения:
    47
    Симпатии:
    9
    Найди 10 отличий =)