[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
変数の整数型への変換を行う関数である 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」に変換され そのためそこでヒットする様になります。
コメント