[PHP]strval関数を完全解説!値を文字列に変換する方法

PHP

こんにちは!今回は、PHPの標準関数であるstrval()について詳しく解説していきます。様々な型の値を文字列に変換する、シンプルだけど重要な関数です!

strval関数とは?

strval()関数は、任意の値を文字列型に変換する関数です。

“string value”の略で、数値、ブール値、オブジェクトなど、様々な型のデータを文字列として扱いたい場合に使用します!

基本的な構文

strval(mixed $value): string
  • $value: 文字列に変換する値(任意の型)
  • 戻り値: 文字列型に変換された値

基本的な使用例

数値の変換

// 整数を文字列に
$num = 123;
$str = strval($num);
echo $str . "\n";        // "123"
var_dump($str);          // string(3) "123"

// 浮動小数点数を文字列に
$float = 3.14;
$str = strval($float);
echo $str . "\n";        // "3.14"
var_dump($str);          // string(4) "3.14"

// 負の数
$negative = -456;
echo strval($negative) . "\n";  // "-456"

ブール値の変換

// trueは"1"に変換
$bool = true;
echo strval($bool) . "\n";  // "1"

// falseは空文字列に変換
$bool = false;
echo strval($bool) . "\n";  // ""(空文字列)

// 型を確認
var_dump(strval(true));   // string(1) "1"
var_dump(strval(false));  // string(0) ""

NULL値の変換

// NULLは空文字列に変換
$null = null;
echo strval($null) . "\n";  // ""(空文字列)
var_dump(strval($null));    // string(0) ""

配列とオブジェクト

// 配列は"Array"という文字列に変換
$array = [1, 2, 3];
echo strval($array) . "\n";  // "Array"(警告が出る)

// オブジェクトは__toString()メソッドが必要
class MyClass {
    public function __toString() {
        return "MyClass instance";
    }
}

$obj = new MyClass();
echo strval($obj) . "\n";  // "MyClass instance"

実践的な使用例

例1: データ型の統一

class DataNormalizer {
    /**
     * 配列の値を文字列に統一
     */
    public static function normalizeToStrings($data) {
        $normalized = [];
        
        foreach ($data as $key => $value) {
            if (is_array($value)) {
                $normalized[$key] = self::normalizeToStrings($value);
            } else {
                $normalized[$key] = strval($value);
            }
        }
        
        return $normalized;
    }
    
    /**
     * 安全に文字列に変換
     */
    public static function safeStringConvert($value) {
        if (is_array($value)) {
            return json_encode($value);
        } elseif (is_object($value)) {
            if (method_exists($value, '__toString')) {
                return strval($value);
            } else {
                return get_class($value);
            }
        } else {
            return strval($value);
        }
    }
    
    /**
     * 空文字列を特定の値に変換
     */
    public static function stringOrDefault($value, $default = 'N/A') {
        $str = strval($value);
        return $str !== '' ? $str : $default;
    }
    
    /**
     * 数値を文字列に変換(型チェック付き)
     */
    public static function numericToString($value) {
        if (is_numeric($value)) {
            return strval($value);
        }
        
        throw new InvalidArgumentException('Value must be numeric');
    }
}

// 使用例
echo "=== データ正規化 ===\n";
$data = [
    'name' => 'John',
    'age' => 30,
    'active' => true,
    'score' => 95.5,
    'notes' => null
];

$normalized = DataNormalizer::normalizeToStrings($data);
print_r($normalized);

echo "\n=== 安全な変換 ===\n";
$values = [123, true, null, [1, 2, 3], new stdClass()];
foreach ($values as $value) {
    echo gettype($value) . ": " . DataNormalizer::safeStringConvert($value) . "\n";
}

echo "\n=== デフォルト値付き変換 ===\n";
echo DataNormalizer::stringOrDefault(100) . "\n";     // "100"
echo DataNormalizer::stringOrDefault(null) . "\n";    // "N/A"
echo DataNormalizer::stringOrDefault(false) . "\n";   // "N/A"

例2: ログ出力

class Logger {
    /**
     * ログメッセージを記録
     */
    public static function log($level, $message, $context = []) {
        $timestamp = date('Y-m-d H:i:s');
        $levelStr = strval($level);
        $messageStr = strval($message);
        
        $log = "[{$timestamp}] [{$levelStr}] {$messageStr}";
        
        if (!empty($context)) {
            $contextStr = self::formatContext($context);
            $log .= " | Context: {$contextStr}";
        }
        
        echo $log . "\n";
    }
    
    /**
     * コンテキストをフォーマット
     */
    private static function formatContext($context) {
        $parts = [];
        
        foreach ($context as $key => $value) {
            $keyStr = strval($key);
            $valueStr = self::valueToString($value);
            $parts[] = "{$keyStr}={$valueStr}";
        }
        
        return implode(', ', $parts);
    }
    
    /**
     * 値を文字列に変換
     */
    private static function valueToString($value) {
        if (is_array($value)) {
            return json_encode($value);
        } elseif (is_bool($value)) {
            return $value ? 'true' : 'false';
        } elseif (is_null($value)) {
            return 'null';
        } else {
            return strval($value);
        }
    }
    
    /**
     * エラーログ
     */
    public static function error($message, $context = []) {
        self::log('ERROR', $message, $context);
    }
    
    /**
     * 情報ログ
     */
    public static function info($message, $context = []) {
        self::log('INFO', $message, $context);
    }
    
    /**
     * デバッグログ
     */
    public static function debug($message, $context = []) {
        self::log('DEBUG', $message, $context);
    }
}

// 使用例
echo "=== ログ出力 ===\n";
Logger::info('User logged in', ['user_id' => 123, 'ip' => '192.168.1.1']);
Logger::error('Database connection failed', ['host' => 'localhost', 'port' => 3306]);
Logger::debug('Processing data', ['count' => 100, 'success' => true]);

例3: CSV出力

class CsvGenerator {
    /**
     * 配列をCSV行に変換
     */
    public static function arrayToCsv($data, $delimiter = ',') {
        $fields = [];
        
        foreach ($data as $value) {
            $strValue = strval($value);
            
            // 区切り文字や引用符が含まれる場合は引用符で囲む
            if (strpos($strValue, $delimiter) !== false || 
                strpos($strValue, '"') !== false) {
                $strValue = '"' . str_replace('"', '""', $strValue) . '"';
            }
            
            $fields[] = $strValue;
        }
        
        return implode($delimiter, $fields);
    }
    
    /**
     * 2次元配列をCSVに変換
     */
    public static function generateCsv($data, $headers = null) {
        $lines = [];
        
        // ヘッダー行
        if ($headers !== null) {
            $lines[] = self::arrayToCsv($headers);
        }
        
        // データ行
        foreach ($data as $row) {
            $lines[] = self::arrayToCsv($row);
        }
        
        return implode("\n", $lines);
    }
    
    /**
     * オブジェクト配列をCSVに変換
     */
    public static function objectsToCsv($objects, $fields) {
        $lines = [];
        
        // ヘッダー
        $lines[] = self::arrayToCsv($fields);
        
        // データ
        foreach ($objects as $obj) {
            $row = [];
            
            foreach ($fields as $field) {
                $value = isset($obj[$field]) ? $obj[$field] : '';
                $row[] = $value;
            }
            
            $lines[] = self::arrayToCsv($row);
        }
        
        return implode("\n", $lines);
    }
}

// 使用例
echo "=== CSV生成 ===\n";

$data = [
    ['John', 30, 'Developer'],
    ['Jane', 25, 'Designer'],
    ['Bob', 35, 'Manager']
];

$headers = ['Name', 'Age', 'Role'];
echo CsvGenerator::generateCsv($data, $headers) . "\n";

echo "\n=== オブジェクト配列をCSV ===\n";
$users = [
    ['id' => 1, 'name' => 'Alice', 'email' => 'alice@example.com'],
    ['id' => 2, 'name' => 'Bob', 'email' => 'bob@example.com']
];
$fields = ['id', 'name', 'email'];
echo CsvGenerator::objectsToCsv($users, $fields) . "\n";

例4: URLクエリ文字列の生成

class QueryStringBuilder {
    /**
     * 配列からクエリ文字列を生成
     */
    public static function build($params) {
        $parts = [];
        
        foreach ($params as $key => $value) {
            $keyStr = strval($key);
            $valueStr = self::valueToQueryString($value);
            
            $parts[] = urlencode($keyStr) . '=' . urlencode($valueStr);
        }
        
        return implode('&', $parts);
    }
    
    /**
     * 値をクエリ文字列用に変換
     */
    private static function valueToQueryString($value) {
        if (is_bool($value)) {
            return $value ? '1' : '0';
        } elseif (is_null($value)) {
            return '';
        } elseif (is_array($value)) {
            return implode(',', array_map('strval', $value));
        } else {
            return strval($value);
        }
    }
    
    /**
     * ネストした配列からクエリ文字列を生成
     */
    public static function buildNested($params, $prefix = '') {
        $parts = [];
        
        foreach ($params as $key => $value) {
            $keyStr = $prefix !== '' ? "{$prefix}[{$key}]" : strval($key);
            
            if (is_array($value)) {
                $parts[] = self::buildNested($value, $keyStr);
            } else {
                $valueStr = self::valueToQueryString($value);
                $parts[] = urlencode($keyStr) . '=' . urlencode($valueStr);
            }
        }
        
        return implode('&', $parts);
    }
}

// 使用例
echo "=== クエリ文字列生成 ===\n";

$params = [
    'name' => 'John Doe',
    'age' => 30,
    'active' => true,
    'tags' => ['php', 'developer']
];

echo QueryStringBuilder::build($params) . "\n";

echo "\n=== ネストしたパラメータ ===\n";
$nestedParams = [
    'user' => [
        'name' => 'Alice',
        'email' => 'alice@example.com'
    ],
    'settings' => [
        'notifications' => true,
        'theme' => 'dark'
    ]
];

echo QueryStringBuilder::buildNested($nestedParams) . "\n";

例5: フォームデータの処理

class FormDataProcessor {
    /**
     * フォームデータを文字列に変換
     */
    public static function prepareForStorage($data) {
        $prepared = [];
        
        foreach ($data as $key => $value) {
            $prepared[$key] = strval($value);
        }
        
        return $prepared;
    }
    
    /**
     * フォーム値を検証用に変換
     */
    public static function normalizeForValidation($data) {
        $normalized = [];
        
        foreach ($data as $key => $value) {
            // 文字列に変換してトリム
            $strValue = strval($value);
            $normalized[$key] = trim($strValue);
        }
        
        return $normalized;
    }
    
    /**
     * 隠しフィールドを生成
     */
    public static function generateHiddenFields($data) {
        $fields = [];
        
        foreach ($data as $key => $value) {
            $keyStr = htmlspecialchars(strval($key));
            $valueStr = htmlspecialchars(strval($value));
            
            $fields[] = "<input type=\"hidden\" name=\"{$keyStr}\" value=\"{$valueStr}\">";
        }
        
        return implode("\n", $fields);
    }
    
    /**
     * データをJSON文字列に
     */
    public static function toJsonString($data) {
        $stringified = [];
        
        foreach ($data as $key => $value) {
            $stringified[$key] = strval($value);
        }
        
        return json_encode($stringified);
    }
}

// 使用例
echo "=== フォームデータ処理 ===\n";

$formData = [
    'username' => '  admin  ',
    'age' => 25,
    'active' => true,
    'score' => 95.5
];

$normalized = FormDataProcessor::normalizeForValidation($formData);
print_r($normalized);

echo "\n=== 隠しフィールド生成 ===\n";
$hiddenData = ['user_id' => 123, 'token' => 'abc123'];
echo FormDataProcessor::generateHiddenFields($hiddenData) . "\n";

echo "\n=== JSON文字列 ===\n";
echo FormDataProcessor::toJsonString($formData) . "\n";

例6: デバッグ出力

class DebugHelper {
    /**
     * 変数を読みやすく出力
     */
    public static function dump($variable, $label = '') {
        $labelStr = $label !== '' ? strval($label) . ': ' : '';
        $type = gettype($variable);
        $value = self::variableToString($variable);
        
        echo "{$labelStr}[{$type}] {$value}\n";
    }
    
    /**
     * 変数を文字列表現に変換
     */
    private static function variableToString($variable) {
        if (is_bool($variable)) {
            return $variable ? 'true' : 'false';
        } elseif (is_null($variable)) {
            return 'null';
        } elseif (is_array($variable)) {
            return json_encode($variable);
        } elseif (is_object($variable)) {
            if (method_exists($variable, '__toString')) {
                return strval($variable);
            } else {
                return get_class($variable) . ' object';
            }
        } else {
            return strval($variable);
        }
    }
    
    /**
     * 複数の変数を一度に出力
     */
    public static function dumpAll($variables) {
        foreach ($variables as $label => $value) {
            self::dump($value, $label);
        }
    }
    
    /**
     * トレース情報付きで出力
     */
    public static function trace($variable) {
        $trace = debug_backtrace()[0];
        $file = basename($trace['file']);
        $line = $trace['line'];
        
        echo "[{$file}:{$line}] ";
        self::dump($variable);
    }
}

// 使用例
echo "=== デバッグ出力 ===\n";

DebugHelper::dump(123, 'number');
DebugHelper::dump(true, 'boolean');
DebugHelper::dump(null, 'null value');
DebugHelper::dump([1, 2, 3], 'array');

echo "\n=== 複数変数出力 ===\n";
$variables = [
    'name' => 'John',
    'age' => 30,
    'active' => true,
    'tags' => ['php', 'developer']
];

DebugHelper::dumpAll($variables);

例7: データエクスポート

class DataExporter {
    /**
     * 配列をタブ区切りテキストに
     */
    public static function toTsv($data) {
        $lines = [];
        
        foreach ($data as $row) {
            $fields = array_map('strval', $row);
            $lines[] = implode("\t", $fields);
        }
        
        return implode("\n", $lines);
    }
    
    /**
     * 配列を固定長フォーマットに
     */
    public static function toFixedWidth($data, $widths) {
        $lines = [];
        
        foreach ($data as $row) {
            $parts = [];
            $i = 0;
            
            foreach ($row as $value) {
                $strValue = strval($value);
                $width = $widths[$i] ?? 10;
                
                $parts[] = str_pad($strValue, $width);
                $i++;
            }
            
            $lines[] = implode('', $parts);
        }
        
        return implode("\n", $lines);
    }
    
    /**
     * 配列をINI形式に
     */
    public static function toIni($data, $section = null) {
        $lines = [];
        
        if ($section !== null) {
            $lines[] = '[' . strval($section) . ']';
        }
        
        foreach ($data as $key => $value) {
            $keyStr = strval($key);
            $valueStr = strval($value);
            
            $lines[] = "{$keyStr}={$valueStr}";
        }
        
        return implode("\n", $lines);
    }
}

// 使用例
echo "=== TSV形式 ===\n";
$data = [
    ['John', 30, 'Developer'],
    ['Jane', 25, 'Designer']
];
echo DataExporter::toTsv($data) . "\n";

echo "\n=== 固定長フォーマット ===\n";
$widths = [15, 5, 15];
echo DataExporter::toFixedWidth($data, $widths) . "\n";

echo "\n=== INI形式 ===\n";
$config = [
    'host' => 'localhost',
    'port' => 3306,
    'database' => 'mydb'
];
echo DataExporter::toIni($config, 'database') . "\n";

キャストとの比較

$num = 123;

// strval()を使用
$str1 = strval($num);

// 文字列キャストを使用
$str2 = (string)$num;

// 結果は同じ
var_dump($str1 === $str2);  // bool(true)

// ただし、可読性の面でstrval()の方が明示的

// ブール値の場合
var_dump(strval(true));   // string(1) "1"
var_dump((string)true);   // string(1) "1"

var_dump(strval(false));  // string(0) ""
var_dump((string)false);  // string(0) ""

型チェックとの組み合わせ

function safeStringConversion($value) {
    // 型チェック
    if (is_array($value)) {
        throw new InvalidArgumentException('Cannot convert array to string');
    }
    
    if (is_object($value) && !method_exists($value, '__toString')) {
        throw new InvalidArgumentException('Object must have __toString method');
    }
    
    return strval($value);
}

// 使用例
try {
    echo safeStringConversion(123) . "\n";      // OK
    echo safeStringConversion([1, 2, 3]) . "\n"; // Exception
} catch (Exception $e) {
    echo "Error: " . $e->getMessage() . "\n";
}

まとめ

strval()関数の特徴をまとめると:

できること:

  • 任意の型を文字列に変換
  • 数値、ブール値、オブジェクトの文字列化
  • データの正規化

変換規則:

  • 整数: そのまま文字列に(例: 123 → “123”)
  • 浮動小数点: そのまま文字列に(例: 3.14 → “3.14”)
  • true: “1”に変換
  • false: “”(空文字列)に変換
  • null: “”(空文字列)に変換
  • 配列: “Array”(警告が出る)
  • オブジェクト: __toString()メソッドが必要

推奨される使用場面:

  • データの正規化
  • ログ出力
  • CSV/TSV生成
  • クエリ文字列の構築
  • フォームデータ処理
  • デバッグ出力

キャストとの違い:

strval($value)    // 関数呼び出し(明示的)
(string)$value    // キャスト(簡潔)

注意点:

  • 配列は”Array”になる(警告が出る)
  • オブジェクトは__toString()が必要
  • falsenullは空文字列になる

関連関数:

  • intval(): 整数に変換
  • floatval(): 浮動小数点数に変換
  • boolval(): ブール値に変換
  • settype(): 型を変更

ベストプラクティス:

// 型チェック付き変換
if (is_scalar($value)) {
    $str = strval($value);
}

// オブジェクトの安全な変換
if (method_exists($obj, '__toString')) {
    $str = strval($obj);
}

strval()は、型の安全な変換が必要な場面で非常に便利です。特にログ出力やデータエクスポートなど、様々な型の値を文字列として扱う必要がある場面で活躍します!

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