【PHP8.x】count_chars関数の使い方
count_chars関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
count_chars関数は、指定された文字列に含まれる各文字(正確にはバイト値)の出現回数を数えたり、その文字に関する情報を取得したりするために実行する関数です。
この関数は、入力された文字列を分析し、具体的にどのような文字が、それぞれ何回含まれているのか、あるいは含まれていないのかといった情報を柔軟に提供します。特に、オプションであるmode引数の値を変更することで、関数の戻り値の形式や内容を細かく制御できます。
例えば、modeを0に設定した場合(これがデフォルトの動作です)は、文字列に含まれる各文字のバイト値をキーとし、その文字が文字列中に現れる回数を値とする連想配列を返します。この配列には、出現しなかった文字は含まれません。もしmodeを1にすると、mode=0と同じ形式ですが、出現回数が1回以上の文字のみが返されます。
また、modeを2に設定すると、今度は文字列中に全く出現しない文字だけをキーとして、その出現回数(常に0)を持つ連想配列が返されます。さらに、modeを3にすると、文字列に含まれるすべてのユニークな文字が連結された一つの文字列を返します。最後に、modeを4にすると、文字列に含まれないすべてのユニークな文字が連結された一つの文字列を返します。
このように、count_chars関数は、文字列の構成を詳細に分析したい場合や、特定の文字の出現頻度、あるいは欠如している文字を効率的に調べたい場合に大変役立つツールです。
構文(syntax)
1<?php 2$input_string = "Hello PHP 8!"; 3$char_byte_counts = count_chars($input_string, 0); 4?>
引数(parameters)
string $string, int $mode = 0
- string $string: カウント対象の文字列
- int $mode = 0: 実行するモードを指定する整数。以下のいずれかの値を取ります。
- 0: 文字列中の各文字が何回出現するかを、ASCII値から見た順番で配列で返します。キーがASCII値、値が出現回数になります。
- 1: 文字列中の各文字が何回出現するかを、出現頻度の高い順で配列で返します。キーが出現回数、値がその出現回数を持つ文字の配列になります。
- 2: 文字列中の各文字を、ASCII値の昇順で配列に格納し、その配列を返します。
- 3: 文字列中の各文字を、出現頻度の降順で配列に格納し、その配列を返します。
- 4: 文字列中の各文字が何回出現するかを、ASCII値の昇順で連想配列で返します。キーが文字、値が出現回数になります。
戻り値(return)
array|string
指定されたモードによって、文字列中の各文字の出現回数を示す連想配列、または指定されたモードによって特定の文字のリストが配列または文字列として返されます。
サンプルコード
PHPで文字列の文字数を数える
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 文字列に含まれる各文字の出現回数を数えて表示します。 7 * 8 * この関数は、PHPの `count_chars()` を使用して、 9 * 指定された文字列内に各文字が何回出現するかを計算し、 10 * その結果をコンソールに出力します。 11 * 12 * @param string $text 解析対象の文字列。 13 */ 14function displayCharacterFrequency(string $text): void 15{ 16 echo "解析する文字列: \"{$text}\"" . PHP_EOL; 17 echo "-------------------------" . PHP_EOL; 18 19 // count_chars() をモード1で使用します。 20 // モード1は、キーに文字のASCIIコード、値に出現回数を持つ連想配列を返します。 21 // このモードでは、一度も出現しなかった文字は結果に含まれません。 22 $charCounts = count_chars($text, 1); 23 24 // 連想配列をループ処理し、結果を分かりやすく表示します。 25 foreach ($charCounts as $asciiCode => $count) { 26 // chr()関数でASCIIコードを実際の文字に変換します。 27 $character = chr($asciiCode); 28 echo "'{$character}' は {$count} 回出現しました。" . PHP_EOL; 29 } 30} 31 32// 解析したい文字列を定義します。 33$sampleString = "Hello, world of PHP 8!"; 34 35// 関数を呼び出して、文字列の文字出現回数を表示します。 36displayCharacterFrequency($sampleString); 37 38?>
このサンプルコードは、PHPのcount_chars関数を使用して、指定した文字列に含まれる各文字の出現回数を数える方法を示しています。count_chars関数は、第一引数に解析したい文字列を、第二引数に処理の挙動を決定するモード番号を受け取ります。
コード内のdisplayCharacterFrequency関数では、count_chars関数の第二引数にモード1を指定しています。モード1を指定すると、戻り値として「キーが文字のASCIIコード、値がその文字の出現回数」となる連想配列が返されます。この際、文字列中に一度も出現しなかった文字は、結果の配列に含まれません。
関数が返す連想配列は$charCounts変数に格納された後、foreachループで処理されます。ループ内では、キーであるASCIIコードをchr関数によって人間が読める文字に変換し、値である出現回数と組み合わせて画面に出力しています。この処理により、「'H' は 1 回出現しました。」のように、どの文字が何回使われているかの一覧が分かりやすく表示されます。
count_chars関数は、ASCII文字(半角英数字など)の出現回数を数えるための関数です。日本語のようなマルチバイト文字を引数に渡すと、文字単位ではなくバイト単位で処理されるため、期待通りの結果にならない点に注意が必要です。また、第2引数のモードによって戻り値の形式が大きく異なります。サンプルで利用しているモード1は、出現した文字のASCIIコードをキーとする配列を返しますが、他のモードでは戻り値が文字列になる場合もあります。そのため、戻り値は実際の文字ではなくASCIIコードであること、そしてそれをchr()関数で文字に変換する必要があることを理解しておくことが大切です。使用する際は、扱う文字の種類と第2引数のモードを意識してください。
PHPで文字列の文字数を数える
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 文字列内に含まれる各文字の出現回数を数えます。 7 * 8 * この関数は、PHPの組み込み関数 `count_chars` を使用して、 9 * 指定された文字列中の各文字(バイト)が何回出現するかを計算し、 10 * 文字をキー、出現回数を値とする連想配列として返します。 11 * 12 * @param string $text 解析対象の文字列。 13 * @return array<string, int> 文字とその出現回数を格納した連想配列。 14 */ 15function getCharacterFrequencies(string $text): array 16{ 17 // count_chars($text, 1) は、文字列に出現する文字の出現回数を返します。 18 // キーは文字のASCII値、値は出現回数です。 19 // 例: 'a' が1回出現 -> [97 => 1] 20 $byteValueCounts = count_chars($text, 1); 21 22 $charCounts = []; 23 // 連想配列をループし、ASCII値のキーを実際の文字に変換します。 24 foreach ($byteValueCounts as $byteValue => $count) { 25 // chr() 関数はASCII値を文字に変換します。 26 $char = chr($byteValue); 27 $charCounts[$char] = $count; 28 } 29 30 return $charCounts; 31} 32 33// --- 実行コード --- 34 35// 解析したい文字列を定義します。 36$sampleString = 'Hello, World! This is a test.'; 37 38// 関数を呼び出して文字の出現回数を取得します。 39$frequencies = getCharacterFrequencies($sampleString); 40 41// 結果を画面に出力します。 42echo "文字列: \"{$sampleString}\"\n"; 43echo "----------------------------------\n"; 44echo "各文字の出現回数:\n"; 45 46foreach ($frequencies as $character => $count) { 47 // スペース文字は分かりにくいので、明示的に表示します。 48 $displayChar = ($character === ' ') ? "' ' (スペース)" : "'{$character}'"; 49 echo "{$displayChar}: {$count}回\n"; 50} 51 52?>
このPHPサンプルコードは、count_chars関数を利用して、文字列内に含まれる各文字の出現回数を数える方法を示しています。
count_chars関数は、第1引数に解析対象の文字列を、第2引数に処理の形式を指定する$modeを受け取ります。このコードでは$modeに1を指定しています。これにより、文字列中に出現した文字のバイト値(文字コード)をキーとし、その出現回数を値とする連想配列が返されます。例えば、'a'が1回出現した場合、キーが97('a'の文字コード)、値が1となります。
しかし、キーが数値のままでは直感的に分かりにくいため、getCharacterFrequenciesという独自の関数内でひと手間加えています。foreachループでcount_chars関数の結果を一つずつ処理し、chr関数を使ってキーであるバイト値を実際の文字に変換しています。そして、文字をキー、出現回数を値とする、より人間が理解しやすい新しい連想配列を再構築して返します。
最後に、この関数を使って得られた結果を画面に分かりやすく表示しています。
count_chars関数は文字をバイト単位で処理します。そのため、このサンプルコードは日本語のようなマルチバイト文字を1文字として正しく数えることができず、意図しない結果になる点に注意が必要です。このコードは、アルファベットや数字など1バイトで表現される文字の出現回数を調べる場合に有効です。また、count_chars関数の第2引数に1を指定しているため、戻り値の配列のキーは文字そのものではなく、文字に対応する番号(ASCII値)となります。コード内で行われているchr()による変換は、この番号を人間が読める文字に戻すための重要な処理です。