[PHP]intval関数の使い方と注意点 – 文字列・浮動小数点数を整数に変換する完全ガイド

PHP

PHPでプログラミングをしていると、文字列や浮動小数点数を整数に変換する必要がある場面によく遭遇します。そんな時に重宝するのがintval関数です。この記事では、intval関数の基本的な使い方から実践的な応用例、そして注意すべき落とし穴まで、詳しく解説していきます。

intval関数とは?

intval関数は、指定された変数の整数値を取得するPHPの組み込み関数です。文字列、浮動小数点数、ブール値など、さまざまなデータ型を整数に変換できます。データの検証やユーザー入力の処理において欠かせない関数の一つです。

基本構文

int intval(mixed $value, int $base = 10)

パラメータ:

  • $value: 整数に変換したい値
  • $base: 変換に使用する基数(2〜36、デフォルトは10進数)

戻り値:

  • 変換された整数値

基本的な使用例

文字列から整数への変換

<?php
// 数字の文字列を整数に変換
echo intval("123");     // 123
echo intval("123.45");  // 123(小数点以下は切り捨て)
echo intval("123abc");  // 123(数字以外の部分は無視)
echo intval("abc123");  // 0(先頭が数字でない場合は0)

// 負の数
echo intval("-456");    // -456
echo intval("-123.78"); // -123
?>

浮動小数点数から整数への変換

<?php
echo intval(123.45);    // 123
echo intval(123.99);    // 123(四捨五入ではなく切り捨て)
echo intval(-123.45);   // -123
echo intval(0.99);      // 0
?>

ブール値の変換

<?php
echo intval(true);      // 1
echo intval(false);     // 0
?>

基数を指定した変換

intval関数の第2引数に基数を指定することで、2進数、8進数、16進数などの変換が可能です。

<?php
// 2進数から10進数への変換
echo intval("1010", 2);     // 10

// 8進数から10進数への変換
echo intval("755", 8);      // 493

// 16進数から10進数への変換
echo intval("FF", 16);      // 255
echo intval("A1B", 16);     // 2587

// 36進数(最大基数)
echo intval("Z", 36);       // 35
?>

実践的な活用例

ユーザー入力の検証と変換

<?php
function validateAndConvertUserId($input) {
    // 空文字列や null のチェック
    if (empty($input)) {
        return null;
    }
    
    $userId = intval($input);
    
    // 0 以下の場合は無効とする
    if ($userId <= 0) {
        return null;
    }
    
    return $userId;
}

// 使用例
$userInputs = ["123", "456abc", "0", "-1", "abc", ""];

foreach ($userInputs as $input) {
    $result = validateAndConvertUserId($input);
    echo "入力: '$input' → 結果: " . ($result ?? 'null') . "\n";
}

// 出力:
// 入力: '123' → 結果: 123
// 入力: '456abc' → 結果: 456
// 入力: '0' → 結果: null
// 入力: '-1' → 結果: null
// 入力: 'abc' → 結果: null
// 入力: '' → 結果: null
?>

フォーム処理での数値変換

<?php
function processOrderForm($postData) {
    $order = [];
    
    // 商品IDの変換
    $order['product_id'] = intval($postData['product_id'] ?? 0);
    if ($order['product_id'] <= 0) {
        throw new InvalidArgumentException('有効な商品IDを指定してください');
    }
    
    // 数量の変換
    $order['quantity'] = intval($postData['quantity'] ?? 1);
    if ($order['quantity'] < 1 || $order['quantity'] > 100) {
        throw new InvalidArgumentException('数量は1〜100の間で指定してください');
    }
    
    // 価格の変換(浮動小数点数を整数の「円」単位に変換)
    $price = floatval($postData['price'] ?? 0);
    $order['price_yen'] = intval($price * 100); // セント単位で保存
    
    return $order;
}

// 使用例
$formData = [
    'product_id' => '123',
    'quantity' => '5',
    'price' => '19.99'
];

try {
    $order = processOrderForm($formData);
    print_r($order);
    // Array
    // (
    //     [product_id] => 123
    //     [quantity] => 5
    //     [price_yen] => 1999
    // )
} catch (Exception $e) {
    echo "エラー: " . $e->getMessage();
}
?>

設定値の読み込みと変換

<?php
class ConfigManager {
    private $config = [];
    
    public function loadFromEnv() {
        // 環境変数から設定を読み込み(すべて文字列)
        $this->config = [
            'max_connections' => intval($_ENV['MAX_CONNECTIONS'] ?? 100),
            'timeout_seconds' => intval($_ENV['TIMEOUT_SECONDS'] ?? 30),
            'debug_mode' => intval($_ENV['DEBUG_MODE'] ?? 0),
            'port' => intval($_ENV['PORT'] ?? 8080),
        ];
    }
    
    public function getInt($key, $default = 0) {
        return intval($this->config[$key] ?? $default);
    }
    
    public function isDebugMode() {
        return $this->getInt('debug_mode') === 1;
    }
}

// 使用例
$config = new ConfigManager();
$config->loadFromEnv();

echo "最大接続数: " . $config->getInt('max_connections') . "\n";
echo "タイムアウト: " . $config->getInt('timeout_seconds') . "秒\n";
echo "デバッグモード: " . ($config->isDebugMode() ? 'ON' : 'OFF') . "\n";
?>

intval関数の注意点と落とし穴

精度の問題

<?php
// 大きな数値での精度の問題
echo intval("9223372036854775808");  // PHPの整数の限界を超える場合
echo intval(9.9999999999999999);     // 浮動小数点数の精度問題

// より安全な方法
function safeIntval($value, $min = null, $max = null) {
    if (is_string($value) && !is_numeric($value)) {
        return false;
    }
    
    $intValue = intval($value);
    
    // 範囲チェック
    if ($min !== null && $intValue < $min) {
        return false;
    }
    if ($max !== null && $intValue > $max) {
        return false;
    }
    
    return $intValue;
}

// 使用例
echo safeIntval("123", 0, 1000);     // 123
echo safeIntval("-5", 0, 1000);      // false(範囲外)
echo safeIntval("abc");              // false(非数値)
?>

文字列の先頭チェック

<?php
// 予期しない動作の例
$values = [
    "123abc",      // 123
    "abc123",      // 0
    " 456",        // 456(先頭の空白は無視される)
    "78.9xyz",     // 78
    "0x1F",        // 0(16進数表記は認識されない)
];

foreach ($values as $value) {
    echo "'$value' → " . intval($value) . "\n";
}

// より厳密な検証が必要な場合
function strictIntval($value) {
    if (!is_numeric($value)) {
        return false;
    }
    
    return intval($value);
}

// または正規表現を使用
function validateInteger($value) {
    if (preg_match('/^-?\d+$/', trim($value))) {
        return intval($value);
    }
    return false;
}
?>

基数指定時の注意点

<?php
// 基数指定時の落とし穴
echo intval("19", 8);        // 1(8進数では9は無効なので1まで)
echo intval("G", 16);        // 0(16進数でGは無効)
echo intval("123", 2);       // 1(2進数では2,3は無効なので1まで)

// 安全な基数変換
function safeBaseConvert($value, $base) {
    $validChars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $validChars = substr($validChars, 0, $base);
    
    if (!preg_match('/^[' . preg_quote($validChars) . ']+$/i', $value)) {
        return false;
    }
    
    return intval($value, $base);
}

echo safeBaseConvert("FF", 16);      // 255
echo safeBaseConvert("GG", 16);      // false
?>

intval vs キャスト vs filter_var

PHPには整数変換の方法が複数あります。それぞれの特徴を理解して使い分けましょう。

<?php
$testValues = ["123", "123.45", "123abc", "abc"];

echo "値\t\tintval\t(int)\tfilter_var\n";
echo "-------------------------------------------\n";

foreach ($testValues as $value) {
    $intval_result = intval($value);
    $cast_result = (int)$value;
    $filter_result = filter_var($value, FILTER_VALIDATE_INT);
    
    printf("%-10s\t%d\t%d\t%s\n", 
        $value, 
        $intval_result, 
        $cast_result, 
        $filter_result === false ? 'false' : $filter_result
    );
}

// 出力例:
// 値        intval  (int)   filter_var
// -------------------------------------------
// 123       123     123     123
// 123.45    123     123     false
// 123abc    123     123     false
// abc       0       0       false
?>

まとめ

intval関数は、PHPでデータ型変換を行う際の基本的な関数ですが、その動作を正しく理解して使用することが重要です。

重要なポイント

  • 柔軟だが寛容すぎる変換:文字列の一部だけを変換するため、厳密な検証が必要な場合は追加チェックが必要
  • 基数指定の活用:2進数、8進数、16進数の変換に便利
  • 精度と範囲の注意:大きな数値や浮動小数点数の扱いに注意
  • 他の変換方法との使い分け:用途に応じてキャストやfilter_var関数と使い分ける

intval関数を適切に活用することで、安全で堅牢なデータ処理が可能になります。ユーザー入力の処理や設定値の変換など、様々な場面で役立つ重要な関数です。

タイトルとURLをコピーしました