忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

PHP 標準関数その3・変数の整数型への変換を行う関数(intval)について


変数の整数型への変換を行う関数である 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)
 

文字列の値が int 型のデータに変換されています。


■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」に変換され そのためそこでヒットする様になります。












PR

コメント

コメントを書く