1. 導入
Webサービスやアプリケーションにおいて、アクセスカウンターやランキング、会員IDの特定など、「切りの良い数字(キリ番)」を検知したいというニーズは意外と多いものです。キャンペーンの当選判定や、ユーザーの達成感を生むための演出(ゲーミフィケーション)に活用できます。本記事では、PHPで「ゼロの連続」「ゾロ目」「連番」を効率的に判定する方法を解説します。
2. 基礎知識
「キリ番」の判定には、パターンマッチングに優れた正規表現(Regular Expression)が適しています。PHPではpreg_match関数を使用します。
・ゼロの連続:1000、20000など、先頭が1-9で始まり、以降が全て0である数値。
・ゾロ目:111、2222など、同じ数字が一定回数繰り返される数値。
・連番:123、2345など、数字が昇順または降順で並んでいる数値。
3. 実装/解決策
判定ロジックを共通化するために、入力値を文字列として扱い、正規表現や文字列比較を行います。正規表現は強力ですが、連番については、文字列の切り出しと比較(substrなど)を用いる方が、コードの可読性とメンテナンス性が高まる場合があります。
4. サンプルプログラム
以下は、特定の数値が「キリ番」であるかを判定する汎用的な関数です。
/
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の整数型上限)を渡した際の挙動をテストケースに含めることを推奨します。特に文字列変換を行う際は、意図しない型変換が起きないよう注意してください。