计算一个二维数组的列中唯一值的出现次数

问题描述 投票:0回答:6

我目前有以下数组:

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']]++;
}
php arrays foreach counting array-column
6个回答
15
投票

这可以通过简单的迭代来完成:

$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 更新

在 PHP 5.5 中,添加了

array_column()
函数来聚合 2D 数组中的内部键,这可以简化为:

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

5
投票

这可以通过一个简单的

array_map
函数来完成

$array = array_map(function($element){
    return $element['group'];
}, $array1);

$array2 = (array_count_values($array));

print_r($array2);

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

0
投票

试试这个简单但有效的方法

$count = call_user_func_array('array_merge_recursive', $Array);
echo count($count['user']).'<br>';
echo count($count['group']).'<br>';

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
)

0
投票

此任务只需要两次本机函数调用。使用

array_column()
隔离所需的数据列,然后使用
array_count_values()
计算出现次数。这是我在我的项目之一中编码此任务的唯一方法。

使用

array_column()
的额外好处是,如果某些子数组不包含目标列键,则不会生成通知/警告。如果您要使用常见的循环技术或
array_map
/
array_walk()
,您可能需要编写条件检查以防止出现通知/警告。

代码:(演示

$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,
)
© www.soinside.com 2019 - 2024. All rights reserved.