こんにちは!今回は、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()が必要 falseとnullは空文字列になる
関連関数:
intval(): 整数に変換floatval(): 浮動小数点数に変換boolval(): ブール値に変換settype(): 型を変更
ベストプラクティス:
// 型チェック付き変換
if (is_scalar($value)) {
$str = strval($value);
}
// オブジェクトの安全な変換
if (method_exists($obj, '__toString')) {
$str = strval($obj);
}
strval()は、型の安全な変換が必要な場面で非常に便利です。特にログ出力やデータエクスポートなど、様々な型の値を文字列として扱う必要がある場面で活躍します!
