Search code examples
phparraysmultidimensional-arraygroupingsub-array

Group 2d array data by a column and push the original row's index into the group's subarray


I have an array like that:

array(
    [0] => array(
        'date' => '2017-12-20',
        'name' => 'test A',
        'kwa' => 'kwa1, kwa2'
    ),
    [1] => array(
        'date' => '2017-12-20',
        'name' => 'test B',
        'kwa' => ''
    ),
    [2] => array(
        'date' => '2017-12-21',
        'name' => 'test C',
        'kwa' => 'kwa1'
    ),
    [3] => array(
        'date' => '2017-12-22',
        'name' => 'test D',
        'kwa' => ''
    ),
    [4] => array(
        'date' => '2017-12-22',
        'name' => 'test E',
        'kwa' => ''
    ),
)

I want group all elements has the same day into a array. Something like that:

array(
    ['2017-12-20'] => array( '0', '1'),
    ['2017-12-21'] => array( '2' ),
    ['2017-12-22'] => array( '3', '4' ),
)

Solution

  • Here is your solution...

    Input

    <?php 
        $array = array(
            array(
                'date' => '2017-12-20',
                'name' => 'test A',
                'kwa' => 'kwa1, kwa2'
            ),array(
                'date' => '2017-12-20',
                'name' => 'test B',
                'kwa' => ''
            ),array(
                'date' => '2017-12-21',
                'name' => 'test C',
                'kwa' => 'kwa1'
            ),array(
                'date' => '2017-12-22',
                'name' => 'test D',
                'kwa' => ''
            ),array(
                'date' => '2017-12-22',
                'name' => 'test E',
                'kwa' => ''
            ),
        );
    

    Solution

        $new = array();
        foreach($array as $r){
           $new[$r['date']][] = array('name'=>$r['name'],'kwa' => $r['kwa']); 
        }
        echo "<pre>";print_r($new);
    
    ?>
    

    Output

        Array
    (
        [2017-12-20] => Array
            (
                [0] => Array
                    (
                        [name] => test A
                        [kwa] => kwa1, kwa2
                    )
    
                [1] => Array
                    (
                        [name] => test B
                        [kwa] => 
                    )
    
            )
    
        [2017-12-21] => Array
            (
                [0] => Array
                    (
                        [name] => test C
                        [kwa] => kwa1
                    )
    
            )
    
        [2017-12-22] => Array
            (
                [0] => Array
                    (
                        [name] => test D
                        [kwa] => 
                    )
    
                [1] => Array
                    (
                        [name] => test E
                        [kwa] => 
                    )
    
            )
    
    )