【PHP実践|実務向け】PHPで「キリ番」を判定するロジックの実装と正規表現の活用

1. 導入

Webサービスやアプリケーションにおいて、アクセスカウンターやランキング、会員IDの特定など、「切りの良い数字(キリ番)」を検知したいというニーズは意外と多いものです。キャンペーンの当選判定や、ユーザーの達成感を生むための演出(ゲーミフィケーション)に活用できます。本記事では、PHPで「ゼロの連続」「ゾロ目」「連番」を効率的に判定する方法を解説します。

2. 基礎知識

「キリ番」の判定には、パターンマッチングに優れた正規表現(Regular Expression)が適しています。PHPではpreg_match関数を使用します。
・ゼロの連続:1000、20000など、先頭が1-9で始まり、以降が全て0である数値。
・ゾロ目:111、2222など、同じ数字が一定回数繰り返される数値。
・連番:123、2345など、数字が昇順または降順で並んでいる数値。

3. 実装/解決策

判定ロジックを共通化するために、入力値を文字列として扱い、正規表現や文字列比較を行います。正規表現は強力ですが、連番については、文字列の切り出しと比較(substrなど)を用いる方が、コードの可読性とメンテナンス性が高まる場合があります。

4. サンプルプログラム

以下は、特定の数値が「キリ番」であるかを判定する汎用的な関数です。

  • 数値がキリ番かどうかを判定する関数
  • @param int $number
  • @return bool
  • /
    function isKiriban(int $number): bool
    {
    $str = (string)$number;

    // 1. ゼロの連続 (例: 100, 5000)
    // ^[1-9]0+$ は、先頭が1-9で、後ろが0の繰り返しであることを意味する
    if (preg_match(“/^[1-9]0+$/”, $str)) {
    return true;
    }

    // 2. ゾロ目 (例: 111, 7777)
    // ^([1-9])\\1{2,}$ は、最初の数字と同じ数字が2回以上続く(合計3桁以上)ことを意味する
    if (preg_match(“/^([1-9])\\1{2,}$/”, $str)) {
    return true;
    }

    // 3. 連番 (例: 123, 4567)
    // 3桁以上の場合のみ判定するロジック
    if (strlen($str) >= 3) {
    $sequence = “1234567890”;
    // 昇順の連番が含まれているか確認
    if (strpos($sequence, $str) !== false) {
    return true;
    }
    // 降順の連番が必要な場合は逆の文字列を用意して比較する
    }

    return false;
    }

    // 動作確認
    $testNumbers = [100, 777, 123, 4567, 12, 50];
    foreach ($testNumbers as $num) {
    if (isKiriban($num)) {
    echo $num . ” はキリ番です!\n”;
    } else {
    echo $num . ” はキリ番ではありません。\n”;
    }
    }
    ?>

    5. 応用・注意点

    ・桁数の制限:ゾロ目判定の正規表現にある「{2,}」は、最初の1文字を含めて「計3文字以上」という条件です。もし「11」のような2桁のゾロ目も含めたい場合は「{1,}」に変更してください。
    ・パフォーマンス:大量の数値をループ処理で判定する場合、正規表現は比較的コストがかかります。頻繁に呼び出される箇所であれば、キャッシュの利用や、判定ロジックを関数化して再利用性を高めることが重要です。
    ・境界値テスト:0や負の数、あるいは非常に大きな数値(PHPの整数型上限)を渡した際の挙動をテストケースに含めることを推奨します。特に文字列変換を行う際は、意図しない型変換が起きないよう注意してください。

    タイトルとURLをコピーしました