Search code examples
phparraysforeachcountingarray-column

Count occurrences of unique values in a column of one 2d array


I currently have the following array:

Array(
    [0] => Array
        (
            [user] => Name 1
            [group] => 1
        )
    [1] => Array
        (
            [user] => Name 2
            [group] => 1
        )
    [2] => Array
        (
            [user] => Name 3
            [group] => 2
        )
    [3] => Array
        (
            [user] => Name 4
            [group] => 2
        )
    [4] => Array
        (
            [user] => Name 5
            [group] => 3
        )
)

I am attempting to create a new array with the various group values as the key, then count how many are in each group to give the following:

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

I have attempted to use the following, however I get undefined index warnings:

$newArr = array();
foreach ($details['user_groups'] as $key => $value) {
    $newArr[$value['user_groups']]++;
}

Solution

  • This can be done with a simple iteration:

    $counts = array();
    foreach ($array as $key=>$subarr) {
      // Add to the current group count if it exists
      if (isset($counts[$subarr['group']]) {
        $counts[$subarr['group']]++;
      }
      // or initialize to 1 if it doesn't exist
      else $counts[$subarr['group']] = 1;
    
      // Or the ternary one-liner version 
      // instead of the preceding if/else block
      $counts[$subarr['group']] = isset($counts[$subarr['group']]) ? $counts[$subarr['group']]++ : 1;
    }
    

    ###Update for PHP 5.5

    In PHP 5.5, which has added the array_column() function to aggregate an inner key from a 2D array, this can be simplified to:

    $counts = array_count_values(array_flip(array_column($array, 'group')));