Menu

PHPの型変換:文字列を数値に、intval()と(int)キャスト

PHPで文字列を整数に変換するには(int) $strかintval($str)を使います。(int) "42"は42、(int) "12abc"は12です。int、float、bool、string、arrayへのキャスト、数値文字列、基数付きのintval、settype、黙って0になる代わりに入力を検証する方法を学びます。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

値を別の型に変換するには、その前に型を括弧で書きます:(int) "42"で整数の42になります。関数の形のintval("42")も同じです。キャストは失敗しません。数値でないテキストは0になり、数字で始まる文字列はその数字の部分だけが残ります。

PHPのキャストは(int)、(float)、(string)、(bool)、(array)、(object)です。それぞれ関数版もあります:intval()、floatval()、strval()、boolval()。

文字列をintに:(int)とintval()が返す値

PHPは先頭の空白を飛ばしたあと、文字列の最初から数字を読み、数値に当てはまらない最初の文字で止まります。指数表記は数値として扱われますが、0xの接頭辞は扱われません。

"12.7"が12になる点に注意してください。intへのキャストは小数部分を切り捨て、四捨五入はしません。入力が何であれ、ここでは(int)もintval()も警告を出しません。

基数付きのintval()

intval($value, $base)は、文字列を別の記数法で読みます。基数を0にすると、PHPは接頭辞を見ます:0xなら16進数、0bなら2進数、先頭の0なら8進数です。

floatからintへ:四捨五入ではなく切り捨て

(int)は小数点以下をすべて0の方向へ切り捨てます。いちばん近い整数が欲しいなら先に丸め、括弧に注意してください。

最後の組はfloatの定番の罠です。(0.1 + 0.7) * 10は7.999999...として保存されるので、切り捨てると7になります。先に丸めれば8です。round、floor、ceilについては数学関数のページで扱っています。

bool、string、arrayへのキャスト

boolへのキャストでfalseになるのは、0、0.0、""、"0"、null、[]のごく一部の値だけです。それ以外はすべてtrueで、"0.0"、" "、"false"もtrueです。

stringへのキャストでは、trueは"1"に、falseとnullはどちらも""になります。floatは末尾の.0が消え、非常に大きいか小さいfloatは指数表記になります。

配列を文字列にキャストしても結合はされません。次のコードはTags: Arrayと出力し、

<?php
$tags = ["php", "web"];
echo "Tags: " . $tags;

PHPは警告を追加します。

Warning: Array to string conversion in /home/index.php on line 3

配列をテキストにするにはimplode(", ", $array)かjson_encode($array)を使います。

すべてのキャストを一覧で

値を選ぶと、intval、(bool)、strval、is_numeric、gettypeがそれぞれ何を返すかがわかります。すべてのセルはPHP 8.3で計算したものです。

$xの各値に対するintval、(bool)、strval、is_numeric
Point at or tap a cell to read it as PHP.
$xintvalboolstrvalis_numericgettype
"10"
"1abc"
"abc"
""
" "
"0"
"0.0"
"1e1"
"010"
1.5
true
false
null
[]
[1, 2]
Every cell computed by PHP 8.3.19.

数値文字列と自動変換

数値文字列とは、"12"、"-3.5"、"1e3"のように数値に見える文字列で、前後に空白があってもかまいません。PHPは算術演算でこれらを自動で変換し、is_numeric()で文字列がそれに当てはまるかを調べられます。

"12abc" + 1は今でも13になりますが、PHP 8はWarning: A non-numeric value encounteredを表示し、"abc" + 1はTypeErrorを投げます。ユーザーの入力で計算する前には、キャストするか検証しましょう。

settype()とgettype()

settype()は変数の型をその場で変え、gettype()は型を報告します。get_debug_type()は、エラーメッセージで目にする短い名前(int、float、string)を返します。

ほとんどのコードでは、短くて読みやすさも変わらないので、代わりにキャスト($value = (int) $value;)を使います。

キャストせずに入力を検証する

(int)は決して拒否しないので、(int) "abc"は黙って0になり、(int) "5 apples"は5になります。フォームの入力にはFILTER_VALIDATE_INTを指定したfilter_varを使いましょう。整数かfalseを返します。

0は正当な整数で、== falseだとそれを拒否してしまうので、結果は=== falseで比較します。範囲の指定やほかのバリデーターはfilter_varのページで紹介しています。

よくある質問

PHPで文字列をintに変換するには?

(int) $strかintval($str)を使います。10進数ならどちらも同じ結果です。(int) "42"は42、(int) "12abc"は12、(int) "abc"は0です。整数でない入力を拒否するには、推測せずにfalseを返すfilter_var($str, FILTER_VALIDATE_INT)を使います。

PHPのintval()と(int)の違いは何ですか?

10進数なら同じ結果を返します。intval()は基数も受け取れます:intval('ff', 16)は255で、基数を0にすると0x、0b、先頭の0(8進数)といった接頭辞を読み取ります。また関数なので、array_map('intval', $values)のようにコールバックとして渡せます。

PHPで(bool) "0"は何を返しますか?

falseです。文字列"0"は、""、0、0.0、null、[]と並ぶPHPのfalseと評価される値の1つです。それ以外の文字列はすべてtrueで、"0.0"、" "、"false"もtrueです。

PHPで数値を文字列に変換するには?

(string) $n、strval($n)を使うか、文字列の中に入れます:"$n"。(string) 3.0は"3"です。小数点以下の桁数を固定するにはnumber_format($n, 2)かsprintf('%.2f', $n)を使います。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める