【PHP8.x】parse_str()関数の使い方
parse_str関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
parse_str関数は、URLのクエリ文字列(例: key=value&key2=value2)のような形式の文字列を解析し、その内容をPHPの配列に格納する関数です。WebアプリケーションでURLパラメータやHTMLフォームからのデータを、プログラムが扱いやすい連想配列形式に変換する際に利用されます。
第一引数には解析したい文字列を、第二引数には解析結果を格納する配列変数を指定します。URLエンコードされた値も自動的にデコードして処理されます。
PHP 8以降では、第二引数の省略は非推奨です。第二引数を省略すると、解析されたキーと値が現在のスコープに直接変数として展開され、外部からの入力によって既存の変数が上書きされるなどのセキュリティリスクが生じるためです。安全なコードを記述するためには、常に第二引数に配列変数を指定し、解析結果を明示的に受け取るようにしてください。
構文(syntax)
1<?php 2$query_string = "name=John+Doe&age=30&city=New+York"; 3$output_array = []; 4parse_str($query_string, $output_array); 5// $output_array は ['name' => 'John Doe', 'age' => '30', 'city' => 'New York'] となります 6?>
引数(parameters)
string $string, array &$result
- string $string: 解析するURLクエリ文字列を指定する文字列
- array &$result: 解析結果を格納する配列。この引数に連想配列として格納されます。
戻り値(return)
void
この関数は、URLクエリ文字列を解析して、指定された配列変数に要素を格納します。戻り値はありません。
サンプルコード
PHPでクエリ文字列をbooleanに変換する
1<?php 2 3/** 4 * クエリ文字列をパースし、特定の値をboolean型に変換して返します。 5 * 6 * 'true', '1', 'on', 'yes' などの文字列は true に、 7 * 'false', '0', 'off', 'no', '' (空文字列) などの文字列は false に変換されます。 8 * それ以外の文字列は元の値を保持します。 9 * 10 * @param string $queryString パースするクエリ文字列。例: "key1=value1&key2=true" 11 * @return array パースおよびboolean変換された連想配列。 12 */ 13function parseQueryStringWithBooleans(string $queryString): array 14{ 15 $parsedData = []; 16 17 // parse_str 関数を使用して、クエリ文字列を連想配列にパースします。 18 // 第2引数は参照渡しで、パース結果がこの配列に格納されます。 19 parse_str($queryString, $parsedData); 20 21 $processedData = []; 22 foreach ($parsedData as $key => $value) { 23 // filter_var 関数と FILTER_VALIDATE_BOOLEAN を使用して、 24 // 文字列をboolean型に変換します。 25 // FILTER_NULL_ON_FAILURE フラグは、booleanとして解釈できない場合に 26 // null を返すように指定します。 27 $filteredValue = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); 28 29 // filter_var が null を返した場合(booleanとして解釈できなかった場合)は、 30 // 元の文字列値を保持します。 31 if ($filteredValue === null) { 32 $processedData[$key] = $value; 33 } else { 34 // booleanとして解釈できた場合は、変換されたboolean値を格納します。 35 $processedData[$key] = $filteredValue; 36 } 37 } 38 39 return $processedData; 40} 41 42// --- 使用例 --- 43 44// サンプルクエリ文字列 45$sampleQueryString = 'name=Alice&isAdmin=true&isActive=1&hasBetaAccess=false&isTestUser=0&age=25&status=active'; 46 47echo "--- 元のクエリ文字列 ---\n"; 48echo $sampleQueryString . "\n\n"; 49 50// 関数を呼び出してパースおよびboolean変換を実行 51$result = parseQueryStringWithBooleans($sampleQueryString); 52 53echo "--- パースおよびboolean変換後のデータ ---\n"; 54print_r($result); 55 56// 別の使用例 57$anotherQueryString = 'debugMode=1&enableLogging=on&disableNotifications=off&isValid=true'; 58echo "\n--- 別のクエリ文字列の例 ---\n"; 59print_r(parseQueryStringWithBooleans($anotherQueryString)); 60 61?>
このPHPコードは、ウェブアプリケーションでよく使われるクエリ文字列(例: key1=value1&key2=true)を扱いやすい連想配列に変換し、さらに特定の文字列値を自動的に真偽値(boolean)に変換するparseQueryStringWithBooleans関数を定義しています。
まず、parse_str関数について説明します。これはPHPの組み込み関数で、HTTPのクエリ文字列のようなフォーマットの文字列をパースし、指定された配列に格納します。引数は二つあり、一つ目はパース対象のstring型のクエリ文字列、二つ目はパース結果が代入される参照渡しのarray型の変数です。この関数自体はvoidを返すため、直接戻り値を受け取るのではなく、第二引数に渡した配列が更新されます。
サンプルコード内のparseQueryStringWithBooleans関数では、parse_strで文字列を連想配列に変換した後、各要素をループ処理しています。この際、filter_var関数とFILTER_VALIDATE_BOOLEANフラグを使用しています。これにより、'true', '1', 'on', 'yes'といった文字列はtrueに、'false', '0', 'off', 'no', '' (空文字列) はfalseに変換されます。FILTER_NULL_ON_FAILUREフラグを併用することで、booleanとして解釈できない文字列の場合はnullを返すようにしています。もしnullが返ってきた場合は元の文字列値をそのまま保持し、そうでない場合は変換されたboolean値を結果の配列に格納します。
この関数を利用することで、ユーザーからの入力など、文字列として渡される可能性のある真偽値データを自動的に適切なPHPのboolean型に変換できるため、データの扱いがより直感的になり、条件分岐などのコードを簡潔に記述できるようになります。
parse_str関数は、第2引数を使わないと意図せずグローバル変数を生成してしまう危険性があります。必ず第2引数に配列変数を指定し、パース結果を受け取るようにしてください。ユーザーからの入力など、信頼できない文字列をparse_strに直接渡す際は、予期せぬデータ構造やキーが生成される可能性があり、セキュリティ上の注意が必要です。filter_varのFILTER_VALIDATE_BOOLEANは、'true', '1', 'on', 'yes' などを true に、'false', '0', 'off', 'no', '' (空文字列) などを false に変換します。この変換ルールを理解し、FILTER_NULL_ON_FAILUREフラグを使うことで、上記以外の文字列を元の値として保持できる点を活用してください。
PHPでクエリ文字列から日時をパースする
1<?php 2 3/** 4 * URLクエリ形式の文字列から日付と時刻を抽出し、DateTimeオブジェクトに変換します。 5 * 6 * parse_str関数を使用して文字列を連想配列にパースし、 7 * そこから日付と時刻の情報を結合してDateTimeオブジェクトを作成します。 8 * 9 * @param string $queryString パースするURLクエリ形式の文字列 (例: "date=2023-10-27&time=15:30:00") 10 * @param string $timezone DateTimeオブジェクトに設定するタイムゾーン (デフォルトは 'UTC') 11 * @return DateTime|null 正常にパースおよび変換できた場合はDateTimeオブジェクト、失敗した場合はnull 12 */ 13function parseQueryStringToDateTime(string $queryString, string $timezone = 'UTC'): ?DateTime 14{ 15 // parse_str関数を使って、クエリ文字列を連想配列にパースします。 16 // 第2引数に&$result配列を渡すことで、パース結果がその配列に格納されます。 17 $params = []; 18 parse_str($queryString, $params); 19 20 // パースされた配列から日付と時刻の要素をチェックします。 21 // "date"と"time"キーが存在し、かつ文字列であることを期待します。 22 if (!isset($params['date']) || !is_string($params['date'])) { 23 // 日付情報が見つからない、または形式が不正な場合はnullを返します。 24 return null; 25 } 26 if (!isset($params['time']) || !is_string($params['time'])) { 27 // 時刻情報が見つからない、または形式が不正な場合はnullを返します。 28 return null; 29 } 30 31 // 日付と時刻の文字列を結合して、完全な日時文字列を作成します。 32 $dateTimeString = $params['date'] . ' ' . $params['time']; 33 34 try { 35 // 指定されたタイムゾーンでDateTimeZoneオブジェクトを作成します。 36 $dateTimeZone = new DateTimeZone($timezone); 37 // 日時文字列とタイムゾーンを使用してDateTimeオブジェクトを作成します。 38 $dateTime = new DateTime($dateTimeString, $dateTimeZone); 39 return $dateTime; 40 } catch (Exception $e) { 41 // DateTimeオブジェクトの作成中にエラーが発生した場合(例: 不正な日時文字列)、 42 // エラーを捕捉し、nullを返します。 43 return null; 44 } 45} 46 47// --- 使用例 --- 48 49// サンプルのクエリ文字列 (日付と時刻、その他の情報を含む) 50$query = "date=2023-10-27&time=15:30:00&event=php_meetup"; 51 52// クエリ文字列から日付時刻をパースし、日本時間で取得します。 53$parsedDateTime = parseQueryStringToDateTime($query, 'Asia/Tokyo'); 54 55if ($parsedDateTime) { 56 echo "成功: パースされた日時: " . $parsedDateTime->format('Y-m-d H:i:s T') . PHP_EOL; 57} else { 58 echo "失敗: 日付のパースに失敗しました (クエリ: {$query})" . PHP_EOL; 59} 60 61echo PHP_EOL; // 空行で区切り 62 63// 日付形式が不正な場合の例 64$invalidDateQuery = "date=invalid-date&time=10:00:00"; 65$parsedInvalidDate = parseQueryStringToDateTime($invalidDateQuery); 66 67if ($parsedInvalidDate) { 68 echo "成功: パースされた日時: " . $parsedInvalidDate->format('Y-m-d H:i:s T') . PHP_EOL; 69} else { 70 echo "失敗: 日付のパースに失敗しました (クエリ: {$invalidDateQuery})" . PHP_EOL; 71} 72 73echo PHP_EOL; // 空行で区切り 74 75// タイムゾーンを指定しない場合の例 (デフォルトの 'UTC' が使用される) 76$utcQuery = "date=2024-01-01&time=09:00:00"; 77$parsedUtcDateTime = parseQueryStringToDateTime($utcQuery); 78 79if ($parsedUtcDateTime) { 80 echo "成功: パースされた日時 (UTC): " . $parsedUtcDateTime->format('Y-m-d H:i:s T') . PHP_EOL; 81} else { 82 echo "失敗: 日付のパースに失敗しました (クエリ: {$utcQuery})" . PHP_EOL; 83} 84 85?>
PHPのparse_str関数は、URLのクエリ文字列のような形式で記述された文字列を、連想配列に変換するために使用されます。このサンプルコードでは、parse_str関数を活用し、"date=2023-10-27&time=15:30:00"のような文字列から日付と時刻の情報を抽出し、PHPのDateTimeオブジェクトに変換するparseQueryStringToDateTimeというカスタム関数を定義しています。
parse_str関数は、最初の引数$stringに解析したいクエリ文字列を渡します。そして、2番目の引数&$resultには、解析結果が格納される空の配列などを参照渡しで指定します。parse_str関数は値を直接返さず(戻り値はvoid)、指定された&$result配列にキーと値のペアをセットします。
parseQueryStringToDateTime関数内では、まずparse_strで入力文字列を$paramsという配列に変換し、そこから'date'と'time'のキーに対応する値を取り出します。これらの値が存在し、かつ有効な文字列であることを確認した後、結合して完全な日時文字列を作成します。その後、指定されたタイムゾーンでDateTimeオブジェクトの生成を試みます。もし日付や時刻の情報が不足していたり、DateTimeオブジェクトの生成中にエラーが発生したりした場合は、try-catchブロックで捕捉し、安全にnullを返すことで処理の失敗を示します。これにより、URLクエリ文字列から安全かつ柔軟に日付時刻情報を扱うことができます。
parse_str関数は、URLクエリ形式の文字列を連想配列に変換する際に、第2引数に&$result配列を渡すことで、グローバル変数を意図せず汚染することなく結果を安全に受け取れます。サンプルコードのように、外部からの入力は常に不正な可能性があるため、dateやtimeといったキーの有無や型を必ず検証してから使用してください。
DateTimeオブジェクトの生成は、日時文字列の形式が重要です。不正な形式ではエラー(Exception)が発生するため、try-catchで安全に処理しましょう。また、タイムゾーンの指定は日時の解釈に必須です。明示しないとPHPのデフォルト設定が適用され、意図しない日時になる恐れがありますので、常に意識してください。
PHPで文字列をfloatにパースする
1<?php 2 3/** 4 * 文字列をパースして、float型に変換可能な場合は変換するサンプル 5 * 6 * @param string $str パースする文字列 7 * @return array パース結果の配列 8 */ 9function parseStringAndConvertToFloat(string $str): array 10{ 11 $result = []; 12 parse_str($str, $result); 13 14 foreach ($result as $key => $value) { 15 if (is_numeric($value)) { 16 $floatValue = floatval($value); 17 if (strval($floatValue) === $value) { // floatに変換しても値が変わらないか確認 18 $result[$key] = $floatValue; 19 } 20 } 21 } 22 23 return $result; 24} 25 26// テスト 27$string = "a=1.23&b=456&c=hello&d=7.89e2"; 28$parsedArray = parseStringAndConvertToFloat($string); 29 30print_r($parsedArray); 31 32?>
parse_str関数は、PHPでURLエンコードされたクエリ文字列をパースし、変数とその値を配列に格納するために使用されます。このサンプルコードでは、parseStringAndConvertToFloat関数を定義し、入力された文字列をparse_strでパースした後、配列内の値をチェックし、数値として解釈できる場合はfloat型に変換しています。
parse_str関数の第一引数$stringは、パース対象の文字列です。第二引数$resultは、パース結果を格納する配列への参照渡しです。parse_str関数自体は戻り値を持ちません。
サンプルコードでは、is_numeric関数で数値かどうかを判定し、floatval関数でfloat型に変換しています。さらに、変換後の値を文字列に戻し、元の値と比較することで、本当にfloat型として適切に表現できるかを確認しています。例えば、整数や小数点を含む文字列がfloat型に変換されます。変換できない文字列("hello"など)はそのまま文字列として配列に残ります。
この処理により、parse_strでパースされた配列内の数値文字列が、必要に応じてfloat型に変換された配列を得ることができます。print_r関数で結果を表示すると、キーと値のペアが出力されます。aは1.23、bは456、cはhello、dは789というように、文字列がパースされ、数値として解釈可能なものはfloat型に変換されていることが確認できます。
parse_str関数は、URLエンコードされた文字列をパースして配列に格納する関数です。第一引数にパース対象の文字列、第二引数に結果を格納する配列を渡します。
注意点として、第二引数は参照渡しであるため、関数内で配列が直接書き換えられます。また、parse_strは複雑な文字列やネストされた構造の解析には向いていません。
このサンプルコードでは、parse_strでパースした後に、数値として解釈できる値はfloat型に変換しています。is_numericで数値かどうかを判定後、floatvalで変換し、さらに文字列に戻して元の値と比較することで、意図しない変換を防いでいます。しかし、文字列によっては予期せぬ結果になる可能性があるため、入力文字列の形式をよく確認してください。例えば、非常に大きな数値や特殊な形式の数値は正しく変換されない場合があります。
PHP parse_strで文字列を数値に変換する
1<?php 2 3/** 4 * parse_str() を使用して、文字列を数値に変換して配列に格納する例 5 */ 6 7$str = "a=1&b=2&c=3"; 8 9// 結果を格納する配列 10$result = []; 11 12// parse_str() を使用して文字列を解析し、結果を配列に格納 13parse_str($str, $result); 14 15// 結果を出力 16print_r($result); 17 18// 各要素が数値として扱えるか確認 19foreach ($result as $key => $value) { 20 if (is_numeric($value)) { 21 $result[$key] = (int)$value; // または (float)$value で浮動小数点数に変換 22 } 23} 24 25// 数値に変換された配列を出力 26print_r($result); 27 28?>
PHPのparse_str()関数は、URLエンコードされたクエリ文字列を解析し、その結果を変数に格納するために使用されます。この関数はstring型の引数 $string を受け取り、解析対象の文字列を指定します。また、オプションで array 型の引数 $result を参照渡しで指定することで、解析結果を格納する配列を指定できます。parse_str()関数自体の戻り値は void で、直接値を返すのではなく、$result に指定された配列の内容を更新します。
サンプルコードでは、まずURLエンコードされた文字列 $str = "a=1&b=2&c=3"; を用意し、空の配列 $result = []; を作成します。parse_str($str, $result); を実行すると、$str の内容が解析され、キー (a, b, c) と値 (1, 2, 3) のペアが $result 配列に格納されます。初期状態では、配列の値はすべて文字列として扱われます。
次に、foreach ループを使用して $result 配列の各要素を調べ、is_numeric() 関数で値が数値として解釈できるかどうかを確認します。数値として解釈できる場合、(int)$value または (float)$value を使用して、それぞれの値を整数または浮動小数点数に明示的に型変換し、$result 配列内の値を更新します。これにより、文字列として格納されていた数値が、実際に数値として扱えるようになります。最後に、変換後の $result 配列の内容を print_r() 関数で出力し、結果を確認します。
parse_str関数を使う際の注意点です。第一引数に渡す文字列は、URLエンコードされた形式である必要があります。parse_strは、結果を第二引数の配列に直接書き込みます。この配列は参照渡しである点に注意してください。
サンプルコードでは、is_numericで数値として扱えるか確認してから、明示的に型変換を行っています。これは、parse_strが全ての値を文字列として扱うためです。数値として扱いたい場合は、この型変換が重要です。
また、parse_strは、register_globals設定に影響される可能性があり、セキュリティ上のリスクがあるため、使用には注意が必要です。もし、変数の上書きを避けるために、明示的に配列に格納する方法が推奨されます。