1

I have the following array

array
(
    [0] => Array
    (
        [market_id] => 10
        [competition_id] => 31        
    )

    [1] => Array
    (
        [market_id] => 10
        [competition_id] => 31        
    )

    [2] => Array
    (
        [market_id] => 11
        [competition_id] => 31        
    )

    [3] => Array
    (
        [market_id] => 11
        [competition_id] => 31        
    )

    [4] => Array
    (
        [market_id] => 11
        [competition_id] => 31        
    )
)

Is there a single function to create below array from the above input or do I have to traverse array manually and get the desired result?

array
(
    [0] => Array
    (
        [0] => Array
        (
            [market_id] => 10
            [competition_id] => 31        
        )
        [1] => Array
        (
            [market_id] => 10
            [competition_id] => 31        
        )
    )
    [1] => Array
    (
        [0] => Array
        (
            [market_id] => 11
            [competition_id] => 31        
        )
        [1] => Array
        (
            [market_id] => 11
            [competition_id] => 31        
        )
        [2] => Array
        (
            [market_id] => 11
            [competition_id] => 31        
        )        
    )
)

All I want is to group my array elements on the basis of market_id field.

ekad
  • 14,436
  • 26
  • 44
  • 46
Neeraj
  • 8,625
  • 18
  • 60
  • 89
  • 1
    How you are getting input array, if you are getting from db then you can use group by clause. – khanz Feb 11 '15 at 07:18
  • 1
    single function? none, i don't think so, just manually create another one, a simple foreach and `array_values` to reindex is enough. – Kevin Feb 11 '15 at 07:28
  • 1
    http://stackoverflow.com/questions/7574857/group-array-by-subarray-values - same question – Sergei Gorjunov Feb 11 '15 at 07:32

2 Answers2

2

Additionaly when you don't want to do his in vanilla PHP, you can use ouzo-goodies:

$array = array(
    0 => array(
        'market_id' => '10',
        'competition_id' => '31'
    ),
    1 => array(
        'market_id' => '10',
        'competition_id' => '31'
    ),
    2 => array(
        'market_id' => '11',
        'competition_id' => '31'
    ),
    3 => array(
        'market_id' => '11',
        'competition_id' => '31'
    ),
    4 => array(
        'market_id' => '11',
        'competition_id' => '31'
    )
);

$groupBy = Arrays::groupBy($array, Functions::extract()->market_id);

print_r($groupBy);

And result:

Array
(
    [10] => Array
        (
            [0] => Array
                (
                    [market_id] => 10
                    [competition_id] => 31
                )

            [1] => Array
                (
                    [market_id] => 10
                    [competition_id] => 31
                )

        )

    [11] => Array
        (
            [0] => Array
                (
                    [market_id] => 11
                    [competition_id] => 31
                )

            [1] => Array
                (
                    [market_id] => 11
                    [competition_id] => 31
                )

            [2] => Array
                (
                    [market_id] => 11
                    [competition_id] => 31
                )

        )

)

Here is docs for Arrays and Functions.

Piotr Olaszewski
  • 6,017
  • 5
  • 38
  • 65
1

No shortcuts. Construct a new array with market_id as the keys, then remove the interim keys:

$result = [];
foreach ($array as $item) {
    $result[$item['market_id']][] = $item;
}
$result = array_values($result);
Ja͢ck
  • 170,779
  • 38
  • 263
  • 309