記事内にはプロモーションが含まれることがあります

【PHP】数値を文字列に変換、文字列を数字に変換する方法

【PHP】数値を文字列に変換、文字列を数字に変換する方法 プログラミングの疑問解決

PHPで開発を行っていると、フォームから送信された文字列を数値として計算したり、データベースから取得した数値を文字列と連結して表示したりする場面が頻繁にあります。

PHPは型に対して柔軟な言語ですが、その仕様を正しく理解していないと、意図しない挙動や予期せぬバグの原因になることも少なくありません。

この記事では、2025年のPHP開発における最新のベストプラクティスに基づき、

  • 数値 → 文字列 への変換方法
  • 文字列 → 数値 への変換方法
  • 変換時に必ず知っておくべき注意点

といったことについて、具体的なサンプルコードを交えながら徹底的に解説します。

【本記事の信頼性】

  • 執筆者は元エンジニア
  • 大手プログラミングスクールのWebディレクター兼ライターを経験
  • 自らも地元密着型のプログラミングスクールを運営
未経験者におすすめの
プログラミングスクール
■Webエンジニアの育成に特化
■自社開発企業への転職成功率がダントツ
■ハイスキルを求める人に最適
■サポートは半永久的
■単価80万円以上の講師陣
■AWSやJavaに強い
■受講料完全無料
■最短1か月で卒業
■教室への通学も可能

PHPで数値から文字列へ変換する3つの方法

まずは、123のような数値を"123"という文字列に変換する方法を見ていきましょう。
主に3つの方法が存在します。

型キャスト(string)を使う

変数の前に(string)と記述することで、その変数を強制的に文字列型に変換する方法です。
これは「型キャスト」と呼ばれ、最もシンプルで直感的な方法といえます。

サンプルコード

<?php
$number = 123;
$string_from_number = (string)$number;

// 型と値を確認
var_dump($string_from_number);
?>

実行結果

string(3) "123"

ソースコードの解説

$numberという変数に整数123を代入しています。
その次の行で、$numberの前に(string)と記述することで、$numberの中身が文字列として扱われ、$string_from_numberに代入されます。

var_dump()は、変数の型や値などの詳細な情報を出力するPHPの関数です。
実行結果を見ると、型がstring(文字列)に変換されていることが明確にわかります。

この方法はコードの意図が明確で読みやすいため、数値から文字列への変換で最も推奨される方法です。

strval()関数を使う

strval()は、引数に指定した値を文字列に変換して返す、PHPの標準関数です。

サンプルコード

<?php
$price = 1980;
$string_from_price = strval($price);

// 型と値を確認
var_dump($string_from_price);
?>

実行結果

string(4) "1980"

ソースコードの解説

strval()関数の引数に、数値が格納された変数$priceを渡しています。関数は1980を文字列の"1980"に変換して返し、それが変数に代入されます。

strvalは「String Value(文字列の値)」の略と覚えるとよいでしょう。
型キャスト(string)と機能的な違いはほとんどありませんが、関数であることが明確なため、チームのコーディング規約によってはstrval()の使用が好まれる場合もあります。

文字列連結による暗黙の型変換

PHPの特性を利用したテクニック的な方法です。

数値型の変数を空の文字列("")とドット(.)で連結すると、PHPが自動的に数値を文字列に変換します。
これを「暗黙の型変換」と呼びます。

サンプルコード

<?php
$age = 25;
$string_from_age = "" . $age;

// 型と値を確認
var_dump($string_from_age);
?>

実行結果

string(2) "25"

ソースコードの解説

PHPでは、文字列連結演算子(.)が使われると、連結する値をすべて文字列として扱おうとします。
そのため、""(空文字列)と$age(数値)を連結しようとすると、$ageの中身が自動的に文字列の"25"に変換されてから処理が進むのです。

この方法は記述が短く済みますが、コードを読んだときに「型を変換している」という意図が分かりにくくなる可能性があります。

そのため、可読性の観点から、(string)strval()のような明示的な変換方法を使うことが強く推奨されます。

PHPで文字列から数値へ変換する3つの方法

次に、Webフォームからの入力値など、"456"のような文字列を456という数値(整数や浮動小数点数)に変換する方法です。

こちらも主に3つの方法があります。

型キャスト(int)や(float)を使う

文字列から数値への変換でも、型キャストが最もシンプルで一般的な方法です。

整数にしたい場合は(int)、小数点を含む数値(浮動小数点数)にしたい場合は(float)を使います。

サンプルコード

<?php
// 文字列を整数(int)に変換
$string_number = "123";
$int_number = (int)$string_number;
var_dump($int_number);

echo "<br>";

// 文字列を浮動小数点数(float)に変換
$string_float = "45.67";
$float_number = (float)$string_float;
var_dump($float_number);

echo "<br>";

// 文字列の途中に数字以外の文字がある場合
$string_mixed = "99bottles";
$int_mixed = (int)$string_mixed;
var_dump($int_mixed);

echo "<br>";

// 文字列の先頭が数字ではない場合
$string_alpha = "abc123";
$int_alpha = (int)$string_alpha;
var_dump($int_alpha);
?>

実行結果

int(123)
float(45.67)
int(99)
int(0)

ソースコードの解説

この方法は非常に便利ですが、一つ重要なルールがあります。
PHPは文字列の先頭から解釈を始め、数値として認識できるところまでを変換対象とします。

  • "123""45.67"のように全体が数値形式であれば、問題なく変換されます。
  • "99bottles"のように、先頭は数字でも途中に文字が含まれる場合、数字の部分だけが変換され99となります。
  • "abc123"のように、先頭が数字ではない場合、PHPは数値として解釈できないと判断し、結果は0になってしまいます。この挙動はバグの原因になりやすいため、十分に注意が必要です。

intval()やfloatval()関数を使う

文字列を数値に変換するための専用関数として、intval()floatval()も用意されています。

サンプルコード

<?php
$string_number = "123";
$int_number = intval($string_number);
var_dump($int_number);

echo "<br>";

$string_float = "45.67";
$float_number = floatval($string_float);
var_dump($float_number);
?>

実行結果

int(123)
float(45.67)

ソースコードの解説

基本的な動作は型キャスト(int)(float)と同じです。

intval()は引数を整数に、floatval()は浮動小数点数に変換します。
文字列の解釈ルール(先頭から見ていく、数字で始まらない場合は0になる)も同様です。

intval()には、型キャストにはない特徴として、第2引数で基数(何進数か)を指定できる機能があります。
例えば、16進数の文字列を10進数の整数に変換したい場合などに役立ちます。

<?php
// 16進数の"FF"を10進数に変換する
$hex_string = "FF";
$decimal_number = intval($hex_string, 16);
var_dump($decimal_number); // int(255)
?>

数学演算による暗黙の型変換

文字列に対して+ 0* 1のような数学的な計算を行うと、PHPが自動的に文字列を数値として解釈し、変換を行います。

サンプルコード

<?php
$string_number = "100";
$number_from_string = $string_number + 0; // または $string_number * 1

// 型と値を確認
var_dump($number_from_string);
?>

実行結果

int(100)

ソースコードの解説

PHPは+*などの数学演算子を見つけると、計算対象を数値として扱おうとします。
そのため、文字列"100"が数値の100に自動で変換されてから計算が実行されるのです。

この方法も動作はしますが、文字列連結のケースと同様に、型変換の意図がコードから読み取りにくくなります。

バグを未然に防ぎ、誰が見ても分かりやすいコードを書くためには、(int)intval()といった明示的な変換を行うべきです。

PHPで数値や文字列を変換する際の注意点とベストプラクティス

PHPの型変換は柔軟で便利ですが、その挙動を過信すると危険です。
ここでは、安全なコードを書くために絶対に知っておくべき注意点と実践方法を紹介します。

変換前にis_numeric()でチェックするのが鉄則

前述の通り、"abc123"のような文字列を数値に変換しようとすると、結果は0になります。
もしこれが商品の個数やユーザーIDだった場合、アプリケーションは致命的な不具合を起こすでしょう。

このような事態を防ぐために、文字列を数値に変換する前には、必ずis_numeric()関数でその文字列が数値として扱えるかチェックするのが鉄則です。

サンプルコード

<?php
// ユーザーからの入力値を想定
$user_input = "abc123";

if (is_numeric($user_input)) {
  // 数値形式の文字列の場合のみ、型変換を実行
  $item_count = (int)$user_input;
  echo "個数: " . $item_count;
} else {
  // 数値形式ではない場合、エラー処理を行う
  echo "エラー: 入力値は数値である必要があります。";
}
?>

実行結果

エラー: 入力値は数値である必要があります。

ソースコードの解説

is_numeric()は、引数の変数が数値、または「数値形式の文字列」である場合にtrueを、そうでない場合にfalseを返します。

このサンプルでは、$user_inputの中身が"abc123"で数値形式ではないため、if文はfalseと判定され、elseブロック内のエラーメッセージが表示されます。

もし$user_input"10"であれば、ifブロックの中が実行され、安全に型変換が行われます。
このようにワンクッションを挟むだけで、コードの堅牢性(バグの起こりにくさ)は劇的に向上します。

(int)とintval()の挙動の違い

基本的な文字列の変換においては、(int)intval()の結果に違いはありません。
どちらを使うかは、個人の好みやチームのコーディング規約に従うのが一般的です。

ただし、ごく稀なケースで挙動に違いが出ることがあります。

例えば、intval()は基数を指定できるという明確なメリットがあります。
基本的には「ほぼ同じもの」と認識しつつ、どちらを使うかよりも、前述のis_numeric()による事前チェックの方が遥かに重要だと覚えておきましょう。

「0」から始まる文字列の罠(8進数問題)

これは特に古いバージョンのPHPでコードを扱う際に注意が必要な問題です。

PHP 7以前のバージョンでは、"077"のように0から始まる数値形式の文字列を(int)でキャストすると、8進数として解釈されてしまう仕様がありました。
そのため、"077"(8進数)は63(10進数)に変換されていました。

しかし、この分かりにくい挙動はPHP 8.0で変更されました。
現在のPHPでは、型キャスト(int)は文字列を8進数として解釈することはなく、見たままの10進数として扱います。

<?php
// PHP 8.0以降の環境
$str = "077";
$num = (int)$str;
var_dump($num); // 実行結果: int(77)
?>

現在、ほとんどの開発環境はPHP 8.0以降であるため、この問題に遭遇することは稀です。
しかし、古いシステムの改修などでPHP 7以前の環境を触る可能性がある場合は、このような挙動があったことを覚えておくと役立ちます。

その際は、intval($str, 10)のように基数を明示的に10と指定することで、意図しない8進数への変換を確実に防ぐことができます。

まとめ

今回は、PHPにおける数値と文字列の相互変換について、基本的な方法から安全な実装のための注意点までを解説しました。

なお、PHPを体系的に学んだり、PHPのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。

細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。

Follow me!

PAGE TOP