変数の整数型への変換を行う関数である intval について説明します。
■intval関数
先ずは intval 関数ですが以下の様な定義になっています。(PHP の正式な説明サイトより)
intval ( mixed $var [, int $base = 10 ] ) : int [説明] 変数の整数としての値を取得する。 指定された値 base を基数(デフォルトは 10)とする、var の int としての値を返します。 オブジェクトに intval() を使用することはできません。その場合は E_NOTICE レベルのエラーを発して 1 を返します。 [パラメータ ] $var :整数に変換する値(変数)。 $base :変換のための基数。 [返り値] 成功時は var の整数値、失敗時は 0。 空の配列の場合は 0、空でない配列の場合は 1 を返します。
それでは、簡単な例のスクリプトを以下に示します。
<?php /* f3-intval-1.php */ // 文字列で数値として成り立つデータを設定 $data = "100"; // 整数変換 $intData = intval($data); // 結果を表示 var_dump($intData); </html>
これをWindowsコマンドプロンプトで実行すると以下の表示になります。
C:\xampp\htdocs\_test>php f3-intval-1.php int(100)
■intval関数を使った各種の例
isset関数を使った、いろんな場合に付いて調べてみます。
<?php /* f3-intval-2.php */
var_dump(intval(100)); // 整数
var_dump(intval(100.5)); // 浮動小数点数
var_dump(intval("100")); // 文字列の整数形式
var_dump(intval("100.5")); // 文字列の浮動小数点数形式
var_dump(intval("")); // 空文字列
echo "\n";
var_dump(intval(true)); // boolean:true
var_dump(intval(false)); // boolean:false
var_dump(intval(null)); // null
echo "\n";
var_dump(intval(array())); // 空の配列
var_dump(intval(array("a", "b"))); // 中身のある配列
echo "\n";
var_dump(intval("abcd")); // 数値を表現しない文字列(半角)
var_dump(intval("あいう")); // 数値を表現しない文字列(全角)
</html>
これをWindowsコマンドプロンプトで実行すると以下の表示になります。 (... 以降は説明で付けただけです。)
C:\xampp\htdocs\_test>php f3-intval-2.php
int(100) ... 整数
int(100) ... 浮動小数点数
int(100) ... 文字列の整数形式
int(100) ... 文字列の浮動小数点数形式
int(0) ... 空文字列
int(1) ... boolean:true
int(0) ... boolean:false
int(0) ... null
int(0) ... 空の配列
int(1) ... 中身のある配列
int(0) ... 数値を表現しない文字列(半角)
int(0) ... 数値を表現しない文字列(全角)
null が「0」に変換され、配列の中身の有り無しで「1」「0」が変換されるのが分かります。
また、一番注意が必要なのは数値を表現できない文字列は「0」変換されることです。 この性質を暗黙の了解的に使って「0」だからと処理をするのはあまり良くないと思われます。
(処理の結果か、もしくはバグでそうなることがありますが、なるべく避けるべきは。)
■intval関数とデータ型の注意点
intval 関数で返される値は int型 であり、文字列型のデータと比較する場合は注意が必要です。
以下に 比較演算子 による違いをスクリプトで示します。
<?php /* f3-intval-3.php */
// Windowsコマンドプロンプトで[XAMPP]のPHPで表示を Shift-JIS にする為の設定
ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); });
// 数字で数値を宣言
$strData = "100";
// int型数値に変換
$intData = intval($strData);
// 単なる比較
echo "単なる比較 : ";
if ($strData == $intData) {
echo "データは一致する。\n";
} else {
echo "データは一致しない。\n";
}
// データ型も含めた比較
echo "データ型も含めた比較 : ";
if ($strData === $intData) {
echo "データは一致する。\n";
} else {
echo "データは一致しない。\n";
}
?>
これをWindowsコマンドプロンプトで実行すると以下の表示になります。
C:\xampp\htdocs\_test>php f3-intval-3.php 単なる比較 : データは一致する。 データ型も含めた比較 : データは一致しない。
ここで 比較演算子 の動きについて注意が必要で、 比較演算子 の 前 と 後 が共に数値形式の文字列の場合、 または、どちらか一方が数値形式の文字列の場合に、数値に変換して比較が行われます。 このため、上記の例で「$strData」は文字列の "100" ですが、数値の 100 として扱われ、比較が行われた結果、等しいものと判断されます。
但し、「===」「!==」の 比較演算子 はデータ型を含めての比較になるため、上記では等しくないと判断されます。
以下に 比較演算子 「==」の例を示します。
<?php /* f3-intval-4.php */ var_dump( 100 == "100" ); var_dump( 100 == "00100" ); var_dump( 100 == " 100" ); var_dump( 100 == "100.5" ); var_dump( 0 == "aaa" ); ?>
これをWindowsコマンドプロンプトで実行すると以下の表示になります。
C:\xampp\htdocs\_test>php f3-intval-4.php bool(true) bool(true) bool(true) bool(false) bool(true)
文字列の部分が数値に変換されて判定されているのが分かります。最後の "aaa" は「0」に変換されるので等しくなります。
ところで、この数値への変換は 比較演算子 の他に switch でも行われるので更に注意が必要です。 以下のスクリプトを見て下さい。
<?php /* f3-intval-5.php */
// Windowsコマンドプロンプトで[XAMPP]のPHPで表示を Shift-JIS にする為の設定
ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); });
// 仮の swicth の判定値の宣言
$strSwicth = "a";
// 文字列のみの判断
switch ($strSwicth) {
case "a":
echo 'swicth で「"a"」の判断'."\n";
break;
case "b":
echo 'swicth で「"b"」の判断'."\n";
break;
}
// 最初に数値[0]の判断後、文字列の判断
switch ($strSwicth) {
case 0:
echo 'swicth で「0」の判断'."\n";
break;
case "a":
echo 'swicth で「"a"」の判断'."\n";
break;
case "b":
echo 'swicth で「"b"」の判断'."\n";
break;
}
?>
これをWindowsコマンドプロンプトで実行すると以下の表示になります。
C:\xampp\htdocs\_test>php f3-intval-5.php swicth で「"a"」の判断 swicth で「0」の判断
最初の switch 文では 「case "a":」の所でヒットしますが、 2番目の switch 文では 「case 0:」のところで判定する値が数値なので「$strSwicth」を数値変換し "a" は数値ではないので「0」に変換され そのためそこでヒットする様になります。
コメント