Php 多维数组中的计数值

Php 多维数组中的计数值,php,arrays,foreach,counting,Php,Arrays,Foreach,Counting,我目前拥有以下阵列: Array( [0] => Array ( [user] => Name 1 [group] => 1 ) [1] => Array ( [user] => Name 2 [group] => 1

我目前拥有以下阵列:

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
            )
)
我试图创建一个新数组,将不同的
值作为键,然后计算每个组中有多少个值,得出以下结果:

Array
(
    [1] => 2
    [2] => 2
    [3] => 1
)
我尝试使用以下内容,但收到未定义的索引警告:

$newArr = array();
foreach ($details['user_groups'] as $key => $value) {
        $newArr[$value['user_groups']]++;
}

(我确实检查了其他答案,但是找不到一个尝试这样做的答案)

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

$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;
}
PHP5.5的更新 在PHP 5.5中,添加了从2D数组聚合内部键的函数,可以简化为:

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

你最初的尝试很接近。您只是在循环中使用了错误的键:

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

这可以通过一个简单的
array\u map
函数来完成

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

$array2 = (array_count_values($array));

print_r($array2);

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

$count = call_user_func_array('array_merge_recursive', $Array);
echo count($count['user']).'<br>';
echo count($count['group']).'<br>';
$count=调用用户函数数组('array\u merge\u recursive',$array);
回声计数($count['user'])。
; 回声计数($count['group'])。

此任务只需要两个本机函数调用。使用
array\u column()
隔离所需的数据列,然后使用
array\u count\u value()
对出现的数据进行计数。这是我在一个项目中编写此任务的唯一方法

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

代码:()

输出:

array (
  1 => 2,
  2 => 2,
  3 => 1,
)

只是为了确保,您正在尝试从第一个数组中获取
?是的,因此第一个数组中的组范围(即1-3)作为新数组的键,然后再次从第一个数组中计算每个组中的组数
$counts[$subar['group']+]我确实尝试过Michael使用我在问题中包含的代码,但是我得到了未定义的索引警告。@gerep与您的不同:)我缺少一个括号,但已经修复了它。@lethalMango您尝试过我在那里的当前版本了吗?它不会给出未定义的索引警告。最初,在完成if/elseSorry之前,我点击了save按钮。我看到了第一个版本:)很有魅力,我猜我错过了一些明显的东西!谢谢,@Vijaysinh Parmar,你在哪里定义了$array1?你可以将问题数组称为$array1。亲爱的@Vijaysinh Parmar,谢谢你这么及时的回复。我用了我自己的答案,但在你回复后我更喜欢你的。谢谢你,这是最终结果还是最终结果?请描述为什么这是解决问题的方法(与现有答案的更实用的方法相比),以及您的方法是如何工作的。
//out put result:=========
Array(
    [1] => 2
    [2] => 2
    [3] => 1
)
$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,
)