【PHP8.x】array_count_values関数の使い方
『array_count_values関数は、配列に含まれる各値の出現回数を数え上げる処理を実行する関数です。この関数は、引数としてカウント対象の配列を一つ受け取ります。処理が成功すると、元の配列の値をキーとし、その値が配列内に何回出現したかを値とする新しい連想配列を返します。例えば、[1, "hello", 1, "world", "hello"]
という配列を引数に渡した場合、[1 => 2, "hello" => 2, "world" => 1]
という連想配列が返されます。この結果から、値1
と"hello"
はそれぞれ2回、値"world"
は1回出現したことがわかります。注意点として、この関数のキーとして使用できるのは、文字列型または整数型の値のみです。もし配列内にnull
や浮動小数点数、オブジェクトなどのキーとして有効でない値が含まれている場合、警告が発生し、それらの値はカウントの対象外となります。データの分布を分析したり、重複する要素の数を調べたりする際に非常に便利な関数です。』
基本的な使い方
構文(syntax)
<?php
$result_array = array_count_values($input_array);
?>
引数(parameters)
array $array
PHP:
- array $array: 値の出現回数を数えたい配列
戻り値(return)
array
与えられた配列の要素をキーとし、その要素が配列内にいくつ出現するかを値とする連想配列を返します。
サンプルコード
PHP: 多次元配列の値出現回数を数える
<?php
declare(strict_types=1);
/**
* 多次元配列に含まれるすべての値の出現回数を数えます。
*
* array_count_values() は1次元配列しか直接処理できません。
* この関数は、多次元配列をまず1次元配列に平坦化(フラット化)してから、
* array_count_values() を適用することで、多次元配列内の値の出現回数を数えます。
*
* @param array $multidimensionalArray 値を数える対象の多次元配列
* @return array 各値の出現回数を格納した連想配列
*/
function count_values_recursively(array $multidimensionalArray): array
{
// 平坦化された値を格納するための配列を初期化します。
$flattenedArray = [];
// array_walk_recursive() を使い、多次元配列の全ての末端要素に対して処理を行います。
// クロージャー(無名関数)を使い、各値を $flattenedArray に追加します。
array_walk_recursive(
$multidimensionalArray,
function ($value) use (&$flattenedArray) {
$flattenedArray[] = $value;
}
);
// 平坦化された1次元配列を array_count_values() に渡して、値の出現回数を返します。
return array_count_values($flattenedArray);
}
// サンプルとして、各店舗のフルーツの販売データを多次元配列で定義します。
$salesData = [
'tokyo_store' => ['apple', 'orange', 'apple'],
'osaka_store' => ['grape', 'orange', 'orange'],
'fukuoka_store' => ['apple', 'grape', 'banana'],
];
// 関数を実行して、全店舗で販売されたフルーツの合計数を計算します。
$totalFruitCounts = count_values_recursively($salesData);
// 結果を出力します。
print_r($totalFruitCounts);
/*
* 実行結果:
*
* Array
* (
* [apple] => 3
* [orange] => 3
* [grape] => 2
* [banana] => 1
* )
*/
PHPの array_count_values
関数は、配列に含まれる各値の出現回数を数えるための便利な関数です。この関数は引数として配列を受け取り、値とその出現回数をペアにした新しい連想配列を返します。ただし、array_count_values
は1次元の配列しか直接処理できないという制約があります。
このサンプルコードは、その制約を回避し、多次元配列に含まれるすべての値の出現回数を数える方法を示しています。そのために、count_values_recursively
という独自の関数を定義しています。この関数は、まず array_walk_recursive
関数を利用して、引数で受け取った多次元配列を1次元の配列に変換(平坦化)します。array_walk_recursive
は、多次元配列の階層をたどり、末端の要素一つひとつに対して指定した処理を実行します。ここでは、見つかった値をすべて新しい配列に格納しています。
その後、平坦化してできた1次元配列を array_count_values
関数に渡すことで、最終的に多次元配列全体での値の出現回数を集計しています。サンプルでは、店舗ごとのフルーツ販売データが格納された多次元配列から、全店舗を合算したフルーツごとの総販売数を算出しています。
array_count_values
関数は1次元配列しか直接処理できないため、サンプルのように多次元配列を扱う場合は、array_walk_recursive
などを用いて事前に1次元配列へ平坦化する必要があります。この関数のもう一つの重要な注意点は、カウントできる値が文字列と整数のみという制約です。小数やオブジェクトなどの値が含まれていると警告が発生し、集計から除外されるため、配列の中身を確認することが大切です。サンプルコードでは、無名関数内で外部の配列$flattenedArray
を更新するためにuse
と参照渡し(&
)が使われています。この記述がないと変数の値が変更されず、意図した結果になりません。
PHP連想配列の値出現回数を集計する
<?php
// ユーザー名(キー)と好きな果物(値)を格納した連想配列を準備します。
$userFavoriteFruits = [
'Taro' => 'apple',
'Jiro' => 'banana',
'Hanako' => 'apple',
'Yoshiko' => 'orange',
'Saburo' => 'banana',
'Goro' => 'apple',
];
// array_count_values() は、連想配列の「値」の出現回数を集計します。
// この例では、キー(ユーザー名)は無視され、値(果物名)がカウントされます。
$fruitCounts = array_count_values($userFavoriteFruits);
// 結果を出力します。
// 元の配列の値であった果物名がキーとなり、その出現回数が値となる新しい連想配列が返されます。
print_r($fruitCounts);
/*
--- 実行結果 ---
Array
(
[apple] => 3
[banana] => 2
[orange] => 1
)
*/
PHPの array_count_values()
関数は、配列内に各値が何回出現するかを集計するための関数です。
この関数は、引数として集計したい配列を一つ受け取ります。サンプルコードでは、ユーザー名をキー、好きな果物を値とする連想配列 $userFavoriteFruits
を引数に渡しています。連想配列を引数にした場合、array_count_values()
はキーを無視し、値のみを集計の対象とします。そのため、この例では 'Taro'
や 'Jiro'
といったユーザー名ではなく、'apple'
や 'banana'
といった果物名の出現回数がカウントされます。
関数の処理が完了すると、結果を格納した新しい連想配列が戻り値として返されます。この新しい連想配列では、元の配列で値だった要素(この例では果物名)がキーとなり、その出現回数が新しい値となります。サンプルコードの実行結果を見ると、'apple'
は3回出現したため ['apple'] => 3
となり、'banana'
は2回、'orange'
は1回出現したことがわかります。このように、データ内の各要素の頻度を簡単に集計したい場合に非常に便利な関数です。
array_count_values
関数は、連想配列のキーではなく、値の出現回数を集計します。サンプルコードのユーザー名のようなキーは完全に無視される点に注意してください。この関数が返す新しい配列では、元の配列の値(果物名)がキーとなり、その出現回数が値となります。また、この関数がカウントできる値は文字列と整数のみです。配列にnullや浮動小数点数などの値が含まれていると警告が発生するため、使用前に対象配列の値の型を確認することが、安全なコードを書く上で重要です。