Search code examples
phparraysmultidimensional-arraygroupingsub-array

Group row data by one column value and populate a subarray in each group with the other column value


I want to group the data in an array with associative rows. Group should be determined by the type value and all label_id values within each group should be formed into a subarray.

Sample input:

$array = [
    ['type' => 'AAA', 'label_id' => 'A1,35'],
    ['type' => 'AAA', 'label_id' => 'A2,34'],
    ['type' => 'BBB', 'label_id' => 'B1,29'],
    ['type' => 'CCC', 'label_id' => 'C1,20'],
    ['type' => 'CCC', 'label_id' => 'C2,19'],
    ['type' => 'CCC', 'label_id' => 'C3,18']
];

The desired result:

[
    [
        'type' => 'AAA',
        'label_id' => [
            'A1,35',
            'A2,34'
        ],
    [
        'type' => 'BBB',
        'label_id' => [
            'B1,29'
        ],
    ],
    [
        'type' => 'CCC',
        'label_id' => [
            'C1,20',
            'C2,19',
            'C3,18',
        ]
    ]
]

Solution

  • This should do the trick

    $args = array
    (
        array( 'type' => 'AAA', 'label_id' => 'A1,35' ),
        array( 'type' => 'AAA', 'label_id' => 'A2,34' ),
        array( 'type' => 'BBB', 'label_id' => 'B1,29' ),
        array( 'type' => 'CCC', 'label_id' => 'C1,20' ),
        array( 'type' => 'CCC', 'label_id' => 'C2,19' ),
        array( 'type' => 'CCC', 'label_id' => 'C3,18' )  
    );
    
    $tmp = array();
    
    foreach($args as $arg)
    {
        $tmp[$arg['type']][] = $arg['label_id'];
    }
    
    $output = array();
    
    foreach($tmp as $type => $labels)
    {
        $output[] = array(
            'type' => $type,
            'label_id' => $labels
        );
    }
    
    var_dump($output);
    

    The output is :

    array
      0 => 
        array
          'type' => string 'AAA' (length=3)
          'label_id' => 
            array
              0 => string 'A1,35' (length=5)
              1 => string 'A2,34' (length=5)
      1 => 
        array
          'type' => string 'BBB' (length=3)
          'label_id' => 
            array
              0 => string 'B1,29' (length=5)
      2 => 
        array
          'type' => string 'CCC' (length=3)
          'label_id' => 
            array
              0 => string 'C1,20' (length=5)
              1 => string 'C2,19' (length=5)
              2 => string 'C3,18' (length=5)