PHPにおけるプログラミングでは、ユーザーからの入力値やデータベースから取得した値を適切な型に変換する作業が欠かせません。
とりわけ、数値を整数として扱いたい場合に多用されるのがintval関数です。
この関数は単純に数値を変換するだけでなく、引数の渡し方や元のデータの状態によって、開発者が予期しない挙動を示すことがあります。
本記事では、intval関数の基本的な仕組みから、実務でハマりやすい注意点までを整理して解説します。
intval関数とは
intval関数は、指定した変数の値を整数(integer)に変換して返すための関数です。
Webアプリケーションでは、URLパラメータやフォームの入力値がすべて文字列として渡されるため、計算処理の前にこの関数で型を整えるのが一般的です。
基本的な構文
この関数の基本的な構文は以下の通りです。
intval(mixed $value, int $base = 10): int
第一引数の$valueには、変換したい値を指定します。
第二引数の$baseは基数と呼ばれ、デフォルトでは10進数として処理されます。
戻り値は、変換に成功した場合はその整数値を返し、変換できない場合は0を返します。
データ型ごとの変換ルール
intval関数に渡す値のデータ型によって、変換結果のルールが異なります。
文字列を整数に変換する場合
文字列を渡した場合、その文字列の先頭から数値として解釈できる部分までが抽出されます。
// 数値から始まる文字列
echo intval("42") . "\n";
echo intval("42abc") . "\n";
// 数値以外から始まる文字列
echo intval("abc42") . "\n";
42
42
0
文字列の先頭が数字ではない場合、結果は0になるという点は、バリデーションの実装時に非常に重要です。
浮動小数点数を整数に変換する場合
浮動小数点数(float)を渡した場合、小数点以下は切り捨てられます。
echo intval(3.14) . "\n";
echo intval(9.99) . "\n";
echo intval(-3.14) . "\n";
3
9
-3
四捨五入や切り上げではなく、純粋に「0に近い方向への切り捨て」が行われることに注意してください。
論理値やその他の型
論理値(boolean)やnullを渡した場合、PHPの標準的な型変換ルールに従います。
| 元の値 | intvalの結果 |
|---|---|
| true | 1 |
| false | 0 |
| null | 0 |
| 空の配列 [] | 0 |
| 値のある配列 [1, 2] | 1 |
第2引数「基数」による変換
intval関数は、第2引数を指定することで、2進数、8進数、16進数などの文字列を10進数の整数に変換できます。
// 16進数の文字列を10進数に変換
echo intval("1f", 16) . "\n";
// 8進数の文字列を10進数に変換
echo intval("10", 8) . "\n";
// 2進数の文字列を10進数に変換
echo intval("1010", 2) . "\n";
31
8
10
ただし、基数を指定する場合、第一引数は必ず文字列である必要があります。
数値型を渡した状態で基数を指定しても、期待した変換が行われないことがあるため注意してください。
intval関数で注意すべき挙動
intval関数を使用する際、エンジニアが最も注意しなければならないのが「浮動小数点数の精度」による計算誤差です。
浮動小数点数の計算精度問題
以下のコードの結果を予想してみてください。
echo intval((0.1 + 0.7) * 10);
人間が計算すれば「0.8 * 10」で「8」になりますが、PHP(および多くのプログラミング言語)の内部処理では異なります。
7
この結果が「7」になる理由は、0.1や0.7が内部的に正確な2進数で表現できず、0.7999999999999999…といった僅かに小さい値として扱われるためです。
小数点以下の切り捨てが行われる際、この僅かな差が原因で期待した値より1小さくなることがあります。
このような誤差を防ぐためには、round関数で一度丸め処理を行うか、任意の精度演算関数(BCMathなど)を検討する必要があります。
(int)キャストとの違い
PHPにはintval()を呼び出す代わりに、(int)や(integer)と記述するキャスト演算子も存在します。
パフォーマンスと機能性の違い
基本的な型変換の結果はintvalと同じですが、いくつかの違いがあります。
- パフォーマンス:キャスト演算子の方が関数呼び出しのオーバーヘッドがないため、わずかに高速です。
- 基数の指定:キャスト演算子では、第2引数による基数の指定ができません。
- 可読性:関数として明示的に呼び出す方が、コードの意図が伝わりやすい場合もあります。
単純な10進数の変換であればキャストを使い、基数変換が必要な場合はintvalを使うという使い分けが推奨されます。
実践的な活用シーン:ユーザー入力の正規化
Webアプリケーションで、商品のIDやページ番号をURLから取得する場合を考えてみましょう。
// URLパラメータ ?page=3abc を取得
$page = $_GET['page'] ?? 1;
$pageNumber = intval($page);
if ($pageNumber <= 0) {
$pageNumber = 1;
}
echo "表示するページ: " . $pageNumber;
このように、ユーザーが不正な文字列を入力した場合でも、intvalを通すことでシステムが安全に処理できる「整数値」へと確実に変換できます。
不適切な入力を排除し、データベースクエリの安全性を高めるためのサニタイズ(無害化)の一環としても役立ちます。
まとめ
intval関数は、PHP開発において非常に汎用性の高い便利なツールです。
文字列から数値への抽出、浮動小数点数の切り捨て、さらには基数変換まで、幅広い役割を担います。
しかし、浮動小数点数の精度問題のように、内部的な数値の扱いを知らなければバグの原因となる挙動も存在します。
本記事で紹介した変換ルールや注意点を踏まえ、適切な場面でintvalを活用し、堅牢なプログラムを作成しましょう。
