【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で文字列を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関数で結果を表示すると、キーと値のペアが出力されます。a1.23b456chellod789というように、文字列がパースされ、数値として解釈可能なものは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設定に影響される可能性があり、セキュリティ上のリスクがあるため、使用には注意が必要です。もし、変数の上書きを避けるために、明示的に配列に格納する方法が推奨されます。

関連コンテンツ

【PHP8.x】parse_str関数の使い方 | いっしー@Webエンジニア