PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

【PHP】文字列内に各文字が出現する回数を数えるプログラムの書き方

PHPでは、文字列の中に各文字が何回出現するかを簡単に調べることができます。本記事では、str_replace()str_split()、連想配列を組み合わせて、文字列中の各文字の出現回数をカウントする方法をサンプルコード付きで解説します。

実装例

<?php
   $str = "welcome to tutorials point";
   $str = str_replace(" ", "", $str); // 空白を削除
   $arr = str_split($str); // 1文字ずつ配列に分解
   foreach ($arr as $key => $val) {
       if (!isset($output[$val])) {
           $output[$val] = 1;
       } else {
           $output[$val] += 1;
       }
   }
   foreach ($output as $char => $number) {
       echo $char . " " . 'appears ' . $number . " " . 'times' . "\n";
   }
?>

コードの解説

処理の流れは以下の通りです。

1. 空白の除去

str_replace(" ", "", $str) を使って、文字列に含まれるすべてのスペースを取り除きます。これにより、文字のみを対象にカウントできるようになります。

2. 文字列の分解

str_split($str) は文字列を1文字ずつ要素に分割し、配列として返す関数です。これで各文字を個別に扱えるようになります。

3. 出現回数のカウント

foreach ループで配列を走査しながら、連想配列 $output のキーに文字を登録していきます。isset() でその文字がまだ登録されていないかを確認し、初登場の文字なら値を「1」に、すでに存在する文字ならカウントを1ずつ加算します。

4. 結果の出力

最後にもう一度 foreach ループを使い、「文字 出現回数」の形式で結果を画面に出力します。

出力結果

w appears 1 times
e appears 2 times
l appears 2 times
c appears 1 times
o appears 4 times
m appears 1 times
t appears 4 times
u appears 1 times
r appears 1 times
i appears 2 times
a appears 1 times
s appears 1 times
p appears 1 times
n appears 1 times

このように、元の文字列「welcome to tutorials point」に含まれる各文字とその出現回数が一覧表示されます。「o」と「t」がそれぞれ4回登場していることがわかります。

別の方法:count_chars() 関数を活用する

PHPには標準で count_chars() という便利な関数が用意されており、同じ処理をより簡潔に実装することも可能です。

<?php
   $str = "welcome to tutorials point";
   $result = count_chars(str_replace(" ", "", $str), 1);
   foreach ($result as $char => $number) {
       echo chr($char) . " appears " . $number . " times\n";
   }
?>

count_chars() の第2引数に「1」を指定すると、出現回数が0より大きい文字のみをバイト値をキーとした連想配列で返します。キーはASCIIコード(バイト値)で返されるため、chr() 関数で元の文字に戻して表示しています。

まとめ

文字列内の文字出現回数のカウントは、str_split() と連想配列を組み合わせた自作ロジックでも、count_chars() 関数でも実装できます。用途に応じて使い分けることで、コードの可読性と効率を高められます。ログ解析やテキスト処理など、さまざまな場面で応用できるテクニックなので、ぜひマスターしておきましょう。

  1. Pythonで指定範囲内で交差する直線の本数を求めるプログラム

    問題の概要 (m, c) というペアを格納したリストが与えられていると仮定しましょう。これらの値は直線 y = mx + c を表しています。さらに、2つの値 l と r も同時に与えられます。ここで求めたいのは、x = l から x = r までの範囲内で互いに交差する直線の本数です。 たとえば、入力が input_list = [[4, 6], [-6, 10], [8, 12]]、l = 0、h = 2 の場合、出力は 2 になります。 上の図を見ると、直線 4x + 6 と -6x + 10 が指定された範囲内で交差していることが分かります。つまり、交差している直線は2本あるため、出

  2. Pythonで文字列を半単調にするために必要な最小の文字更新回数を求める方法

    問題概要小文字の英字のみで構成された、長さが偶数の文字列 s が与えられます。すべてのインデックス i(0 ≤ i < n/2)および j(n/2 ≤ j < n)の組み合わせに対して、次の3つの条件のいずれかひとつが一貫して成り立つようにするには、最低でも何文字を書き換える必要があるかを求めます。s[i] > s[j]s[i] < s[j]s[i] == s[j]たとえば、入力が s = pppxxp の場合、答えは 1 になります。末尾の p を x に1文字だけ変更すれば、すべてのペアで条件 s[i] < s[j] が満たされるためです。解法のアプローチこの