10

私は現在次の配列を持っています:

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をチェックしましたが、同じことをしようとしているものを見つけることができませんでした)

4

6 に答える 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;
}

PHP5.5のアップデート

2D配列から内部キーを集約する関数を追加しarray_column()たPHP5.5では、これを次のように簡略化できます。

$counts = array_count_values(array_flip(array_column($array, 'group')));
于 2012-04-18T18:34:46.997 に答える
6

これは簡単なarray_map機能で行うことができます

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

$array2 = (array_count_values($array));

print_r($array2);
于 2013-12-19T06:32:39.097 に答える
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']]++;
}
于 2012-04-18T19:00:02.623 に答える
0

このシンプルだが効果的な方法を試してください

$count = call_user_func_array('array_merge_recursive', $Array);
echo count($count['user']).'<br>';
echo count($count['group']).'<br>';
于 2015-03-12T10:28:49.133 に答える
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
)
于 2020-03-25T06:55:47.777 に答える
0

このタスクに必要なネイティブ関数呼び出しは2つだけです。でデータの目的の列を分離しarray_column()、次にで発生をカウントしarray_count_values()ます。これは、私のプロジェクトの1つでこのタスクをコーディングする唯一の方法です。

を使用することの追加の利点は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,
)
于 2020-12-09T21:09:11.063 に答える