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

array-column, arrays, counting, foreach, php

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')));

Problem

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']]++; } ```

Original source