В настоящее время у меня есть следующий массив:
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 ) )
Я пытаюсь создать новый массив с различными значениями group
в качестве ключа, а затем подсчитайте количество в каждой группе, чтобы дать следующее:
Array ( [1] => 2 [2] => 2 [3] => 1 )
Я попытался использовать следующее, однако я получаю неопределенные предупреждения индексов:
$newArr = array(); foreach ($details['user_groups'] as $key => $value) { $newArr[$value['user_groups']]++; }
(Я проверял SO для других ответов, однако не мог найти попытку сделать то же самое)
Это можно сделать с помощью простой итерации:
$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; }
В PHP 5.5, который добавил функцию array_column()
для агрегирования внутреннего ключа из 2D-массива, это можно упростить:
$counts = array_count_values(array_flip(array_column($array, 'group')));
Это можно сделать с помощью простой функции array_map
$array = array_map(function($element){ return $element['group']; }, $array1); $array2 = (array_count_values($array)); print_r($array2);
Ваша первоначальная попытка была близка. Вы просто использовали неправильный ключ внутри цикла:
$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']]++; }
Попробуйте этот простой, но эффективный способ
$count = call_user_func_array('array_merge_recursive', $Array); echo count($count['user']).'<br>'; echo count($count['group']).'<br>';