Grouping arrays in PHP

36,830

Solution 1

Just iterate over the array and use another array for the groups. It should be fast enough and is probably faster than the overhead involved when using sqlite or similar.

$groups = array();
foreach ($data as $item) {
    $key = $item['key_to_group'];
    if (!isset($groups[$key])) {
        $groups[$key] = array(
            'items' => array($item),
            'count' => 1,
        );
    } else {
        $groups[$key]['items'][] = $item;
        $groups[$key]['count'] += 1;
    }
}

Solution 2

$groups = array();
foreach($items as $item)
    $groups[$item['value']][] = $item;
foreach($groups as $value => $items)
    echo 'Group ' . $value . ' has ' . count($items) . ' ' . (count($items) == 1 ? 'item' : 'items') . "\n";

Solution 3

Here's a quick example:

$a = array(1, 2, 3, 1, 2, 3, 3, 2, 3, 2, 3, 4, 4, 1);
$n = array_count_values($a);
arsort($n);

print_r($n);

Array ( [3] => 5 [2] => 4 [1] => 3 [4] => 2 )

Solution 4

$aA = array_count_values(array(1,2,3,4,5,1,2,3,4,5,6,1,1,1,2,2));
$aB = array();
foreach($aA as $index=>$aux){
     array_push($aB,$index);
}
print_r($aB);

Result:

Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 ) 
Share:
36,830
GivP
Author by

GivP

Updated on October 21, 2020

Comments

  • GivP
    GivP over 3 years

    I have an array of 200 items. I would like to output the array but group the items with a common value. Similar to SQL's GROUP BY method. This should be relatively easy to do but I also need a count for the group items.

    Does anyone have an efficient way of doing this? This will happen on every page load so I need it to be fast and scalable.

    Could I prehaps dump the results into something like Lucene or sqlite then run a query on that document on each page load?

    Any thoughts would be greatly appreciated.

  • GorillaApe
    GorillaApe about 12 years
    sql servers do it faster most of the time
  • user1494912
    user1494912 over 9 years
    isset is very important. that's what i missed
  • mickmackusa
    mickmackusa over 2 years
    I think this answer is missing clarity / explanation.