我目前有以下数组:
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的其他答案,但无法找到试图做同样的事情)
答案 0 :(得分:12)
这可以通过简单的迭代来完成:
$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')));
答案 1 :(得分:6)
这可以通过简单的array_map
函数
$array = array_map(function($element){
return $element['group'];
}, $array1);
$array2 = (array_count_values($array));
print_r($array2);
答案 2 :(得分:2)
您的初步尝试已接近尾声。你只是在循环中使用了错误的键:
$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']]++;
}
答案 3 :(得分:0)
尝试这种简单但有效的方式
$count = call_user_func_array('array_merge_recursive', $Array);
echo count($count['user']).'<br>';
echo count($count['group']).'<br>';
答案 4 :(得分:0)
$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
)
答案 5 :(得分:0)
此任务仅需要两个本机函数调用。使用array_column()
隔离所需的数据列,然后使用array_count_values()
进行计数。这是我在一个项目中编写此任务的唯一方法。
使用array_column()
的附加好处是,如果您的某些子数组不包含目标列键,则不会生成任何“通知/警告”。如果要使用通用循环技术或array_map
/ array_walk()
,则可能需要编写条件检查以防止“注意事项/警告”。
代码:(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'))
);
输出:
array (
1 => 2,
2 => 2,
3 => 1,
)