Reputation: 4491
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']]++;
}
Upvotes: 10
Views: 38476
Reputation: 47894
You only need two native function calls for this task. Isolate the desired column of data with array_column()
, then count the occurrences with array_count_values()
. This is the only way that I would code this task in one of my projects.
The added benefit of using array_column()
is that if some of your subarrays do not contain the targeted column key, then there will be no Notice/Warning generated. If you were to use a common looping technique or array_map
/array_walk()
instead, you might need to write conditional checks to prevent the Notices/Warnings.
Code: (Demo)
$array = [
['user' => 'Name 1', 'group' => 1],
['user' => 'Name 2', 'group' => 1],
['user' => 'Name 3', 'group' => 2],
['user' => 'Name 4', 'group' => 2],
['user' => 'Name 5', 'group' => 3],
];
var_export(
array_count_values(array_column($array, 'group'))
);
If you have a good reason to use a manual loop (such as summing the encountered values or multiplying values by a quantity before adding), just null coalesce to 0 to prevent PHP complaining about incrementing/adding-to an undeclared variable. Demo
$result = [];
foreach ($array as ['group' => $g]) {
$result[$g] = ($result[$g] ?? 0) + 1;
}
var_export($result);
Output (from either snippet):
array (
1 => 2,
2 => 2,
3 => 1,
)
Upvotes: 0
Reputation: 1
$output = array();
foreach($data as $key => $value){
$output[$value['group']]['count']++;
}
$final = array();
foreach($output as $key => $value){
$final[$key] = $value['count'];
}
print_r($final);
//out put result:=========
Array(
[1] => 2
[2] => 2
[3] => 1
)
Upvotes: 0
Reputation: 927
This can be done with a simple array_map
function
$array = array_map(function($element){
return $element['group'];
}, $array1);
$array2 = (array_count_values($array));
print_r($array2);
Upvotes: 5
Reputation: 1
Try this simple but effective way
$count = call_user_func_array('array_merge_recursive', $Array);
echo count($count['user']).'<br>';
echo count($count['group']).'<br>';
Upvotes: 0
Reputation: 270637
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')));
Upvotes: 15
Reputation: 28889
Your initial attempt was close. You were simply using the wrong key inside the loop:
$newArr = array();
foreach ($details['user_groups'] as $key => $value) {
// What you were using:
// $newArr[$value['user_groups']]++;
// What you should be using:
$newArr[$value['group']]++;
}
Upvotes: 2