PHPでは、 array_count_values()関数は、配列内の各値の発生数をカウントする非常に便利な関数です。この関数の定義は次のとおりです。
array_count_values(array $array): array
array_count_values()関数の主な関数は、元の配列内のすべての値と各値が表示される回数を含む連想配列を返すことです。例えば:
$array = array(1, 2, 2, 3, 3, 3, 4);
$result = array_count_values($array);
print_r($result);
出力は次のとおりです。
Array
(
[1] => 1
[2] => 2
[3] => 3
[4] => 1
)
厳密に言えば、 array_count_values()関数は1次元配列用に設計されているため、1次元配列の要素を反復し、各値が表示される回数をカウントします。 1次元配列が渡されると、予想どおりに機能し、カウント結果を返すことができます。
ただし、多次元配列を渡すと、 array_count_values()は、配列の最も外側(最初のレイヤー)要素のみを考慮し、内側の層にネストされた配列を無視します。配列に多次元配列または他の複雑なデータ構造が含まれている場合、 array_count_values()は再帰的に処理しません。
例を見てみましょう:
$array = array(
'a' => 1,
'b' => 2,
'c' => array(1, 2),
'd' => 3,
);
$result = array_count_values($array);
print_r($result);
出力は次のとおりです。
Array
(
[1] => 1
[2] => 1
[3] => 1
)
ご覧のとおり、 array_count_values()は最も外側の要素のみをカウントし、キーcの配列値を無視します。多次元配列内のすべての値をカウントしたい場合は、まず「フラット化」する必要があります。たとえば、 array_walk_recursive()を使用するか、再帰で処理する必要があります。
多次元配列内の各値の発生数をカウントする必要がある場合は、再帰的な方法を使用して配列をフラット化できます。これが例です:
function flattenArray($array) {
$result = [];
array_walk_recursive($array, function($value) use (&$result) {
$result[] = $value;
});
return $result;
}
$array = array(
'a' => 1,
'b' => 2,
'c' => array(1, 2),
'd' => 3,
);
$flattenedArray = flattenArray($array);
$result = array_count_values($flattenedArray);
print_r($result);
出力は次のとおりです。
Array
(
[1] => 2
[2] => 2
[3] => 1
)
再帰モードを介して、多次元配列をフラット化し、 array_count_values()を使用してカウントします。これにより、多次元配列内のすべての値をカウントできます。
array_count_values()関数自体は、1次元配列にのみ使用できます。多次元配列が渡される場合、関数は最も外側の要素の値のみをカウントし、ネストされた配列の値をカウントしません。多次元配列を処理するには、最初に再帰的またはその他の方法でそれらを平坦化し、次にarray_count_values()を使用して各値の発生数をカウントできます。