導入
Web開発において、ランキング表示や日付の表示、リストの順序付けなどで数値を序数(1st, 2nd, 3rd…)として表記したいケースは多々あります。英語圏のUIでは非常に一般的な表現ですが、PHPには標準で数値を序数に変換する関数は用意されていません。本稿では、数学的な規則に基づき、効率的に序数を判定・生成するロジックを解説します。
基礎知識
英語の序数には特有のルールがあります。
1. 基本ルールとして、末尾が1なら「st」、2なら「nd」、3なら「rd」を付与する。
2. それ以外の数値には「th」を付与する。
3. ただし、11, 12, 13 は例外であり、すべて「th」となる。
このルールを実装する際、剰余演算子(%)を用いることで、数値の末尾(1の位)を簡単に抽出することができます。また、10の位を判定することで、11〜13の例外処理をスマートに分岐させることが可能です。
実装/解決策
ロジックを構築する際は、まず「例外(11, 12, 13)」を先に判定し、それ以外の数値を「1の位」で分岐させるのが最も可読性が高く、バグを抑えられる実装です。
以下のサンプルコードでは、汎用性を考慮し、どのような整数値にも対応できるように関数化しています。
サンプルプログラム
/
function getOrdinalSuffix(int $num): string
{
// 10の位と1の位を取得
$ones = $num % 10;
$tens = floor(($num % 100) / 10);
// 11, 12, 13 は例外的にすべて “th” になる
if ($tens == 1) {
return $num . “th”;
}
// 1の位による分岐
switch ($ones) {
case 1:
return $num . “st”;
case 2:
return $num . “nd”;
case 3:
return $num . “rd”;
default:
return $num . “th”;
}
}
// 1から30までテスト出力
for ($i = 1; $i <= 30; $i++) {
echo getOrdinalSuffix($i) . PHP_EOL;
}
?>
応用・注意点
1. 負の数や0への対応: 上記の実装は正の整数を前提としています。もしシステム上で0や負の数が発生し得る場合は、入力値のバリデーションを追加し、必要に応じて「0th」を許容するか、エラーを返すか等の仕様を定義してください。
2. 国際化(i18n): もし多言語対応が必要なアプリケーションであれば、序数の付け方は言語によって大きく異なります。ロジックを直接埋め込むのではなく、翻訳ファイルや専用のライブラリ(例: Intl拡張モジュールのMessageFormatterなど)の利用を検討してください。
3. 型安全性: PHP 7以降では引数と戻り値に型宣言(Type Hinting)を行うことで、予期せぬ型混入を防ぐことができます。実務では必ず型を明示し、保守性を高めることを推奨します。