【PHP8.x】http_build_query()関数の使い方
http_build_query関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
http_build_query関数は、配列またはオブジェクトをURLエンコードされたクエリ文字列に変換する関数です。この関数は、ウェブアプリケーションにおいてHTTPリクエストのパラメータを構築する際に非常に役立ちます。例えば、ウェブフォームから送信されるデータをURLのクエリ部分に追加したり、外部のAPIへリクエストを送る際のパラメータとして利用したりする場合に活用されます。
具体的には、キーと値のペアを持つ配列(例: ['name' => '山田 太郎', 'id' => 123])を入力として与えると、name=%E5%B1%B1%E7%94%B0+%E5%A4%AA%E9%83%8E&id=123のような形式の文字列を生成します。この際、URLにとって特別な意味を持つ文字(スペースや日本語などの非ASCII文字、一部の記号など)は、自動的にURLエンコードされます。これにより、開発者が手動でエンコード処理を行う手間を省き、URLの形式が正しく保たれ、データが安全かつ確実に送信されることが保証されます。
多次元配列やオブジェクトも処理できるため、複雑なデータ構造も簡単にクエリ文字列に変換できます。生成される文字列は、通常、HTTP GETリクエストのURLに付加されるか、HTTP POSTリクエストのボディのapplication/x-www-form-urlencoded形式のデータとして使用されます。この関数は、ウェブ開発におけるデータの送受信の基盤となる重要な機能の一つです。
構文(syntax)
1<?php 2$data = ['param1' => 'value1', 'param2' => 'value 2']; 3$query_string = http_build_query($data); 4?>
引数(parameters)
array|object $data, string $numeric_prefix = '', ?string $arg_separator = null, int $encoding_type = PHP_QUERY_RFC1738
- array|object $data: クエリ文字列に変換したい配列またはオブジェクト
- string $numeric_prefix = '': 数値キーを持つ配列要素のキーの先頭に付加する文字列(デフォルトは空文字列)
- ?string $arg_separator = null: 引数間の区切り文字として使用する文字列(デフォルトは &)
- int $encoding_type = PHP_QUERY_RFC1738: エンコーディングの種類を指定する整数(PHP_QUERY_RFC1738 または PHP_QUERY_RFC3986)
戻り値(return)
string
URLクエリ文字列を生成します。指定された配列やオブジェクトをキーと値のペアに変換し、URLで利用できる形式の文字列として返します。
サンプルコード
php http_build_queryでクエリ文字列を配列に戻す
1<?php 2 3/** 4 * 配列をクエリ文字列に変換し、それを元の配列に戻す例 5 */ 6 7// 元の配列データ 8$data = [ 9 'name' => 'John Doe', 10 'age' => 30, 11 'city' => 'New York' 12]; 13 14// http_build_query() を使用してクエリ文字列を生成 15$query_string = http_build_query($data); 16 17echo "生成されたクエリ文字列: " . $query_string . PHP_EOL; 18 19// parse_str() を使用してクエリ文字列を配列に戻す 20parse_str($query_string, $result); 21 22echo "parse_str() で配列に戻した結果:". PHP_EOL; 23print_r($result); 24 25// オブジェクトの場合 26$object = (object) [ 27 'name' => 'Jane Doe', 28 'age' => 25, 29 'city' => 'Los Angeles' 30]; 31 32$query_string_from_object = http_build_query($object); 33 34echo "オブジェクトから生成されたクエリ文字列: " . $query_string_from_object . PHP_EOL; 35 36parse_str($query_string_from_object, $result_from_object); 37 38echo "parse_str() でオブジェクトから配列に戻した結果:". PHP_EOL; 39print_r($result_from_object);
http_build_query関数は、PHPのextensionで提供される関数の一つで、配列やオブジェクトをURLエンコードされたクエリ文字列に変換するために使用します。引数$dataに変換したい配列またはオブジェクトを渡します。$numeric_prefixは、数値キーを持つ配列要素のキーの前に付加するプレフィックスを指定します(省略可)。$arg_separatorは、引数セパレータを指定します(省略可、デフォルトは &)。$encoding_typeは、URLエンコードのタイプを指定します(省略可、デフォルトは PHP_QUERY_RFC1738)。
このサンプルコードでは、まず連想配列$dataをhttp_build_query()関数を使ってクエリ文字列に変換しています。生成されたクエリ文字列はname=John+Doe&age=30&city=New+Yorkのようになります。
次に、parse_str()関数を使って、生成されたクエリ文字列を元の配列に戻しています。parse_str()関数は、クエリ文字列を解析し、結果を配列に格納します。
同様に、オブジェクトをhttp_build_query()関数に渡してクエリ文字列を生成し、parse_str()関数で配列に戻す例も示しています。このように、http_build_query関数は配列だけでなくオブジェクトも処理できます。
http_build_query関数の戻り値は、生成されたクエリ文字列です。この関数とparse_str関数を組み合わせることで、配列とクエリ文字列を相互に変換することが可能です。これは、GETリクエストの作成や、セッションデータの保存など、様々な場面で役立ちます。
http_build_query関数は、配列やオブジェクトをURLエンコードされたクエリ文字列に変換する関数です。parse_str関数と組み合わせて、クエリ文字列と配列を相互に変換できます。http_build_queryにオブジェクトを渡した場合も同様に処理されます。
注意点として、parse_str関数は、引数に直接クエリ文字列を渡すと、現在のスコープの変数を上書きする可能性があります。必ず第2引数に配列を渡して、結果を格納するようにしてください。また、URLエンコードの種類(encoding_type引数)を適切に設定しないと、文字化けが発生する可能性があります。PHP_QUERY_RFC3986はRFC3986に準拠したエンコードを行い、より厳格なURL形式に適しています。
PHP: http_build_queryとjson_encodeの使い分け
1<?php 2 3/** 4 * http_build_query と json_encode の使い分けを示すサンプル. 5 */ 6function demonstrateQueryBuilderVsJsonEncoder(): void 7{ 8 $data = [ 9 'name' => '太郎', 10 'age' => 30, 11 'city' => '東京', 12 'skills' => ['PHP', 'JavaScript', 'MySQL'] 13 ]; 14 15 // http_build_query を使用して URL エンコードされた文字列を生成 16 $query = http_build_query($data); 17 echo "http_build_query: " . $query . PHP_EOL; 18 19 // URLのskillsパラメータを展開して表現 20 $query_expanded = http_build_query($data, '', '&', PHP_QUERY_RFC3986); 21 echo "http_build_query (RFC3986): " . $query_expanded . PHP_EOL; 22 23 // json_encode を使用して JSON 文字列を生成 24 $json = json_encode($data, JSON_UNESCAPED_UNICODE); 25 echo "json_encode: " . $json . PHP_EOL; 26 27 // json_encodeされたデータをデコード 28 $decoded_json = json_decode($json, true); 29 echo "json_decode: " . PHP_EOL; 30 print_r($decoded_json); 31} 32 33demonstrateQueryBuilderVsJsonEncoder();
http_build_query関数は、PHPで配列やオブジェクトをURLエンコードされたクエリ文字列に変換するために使用されます。この関数は、Web APIへのリクエストやURLパラメータの作成に役立ちます。第一引数$dataには、変換したい配列またはオブジェクトを指定します。第二引数$numeric_prefixは、数値キーを持つ要素のプレフィックスを指定する場合に使用します。第三引数$arg_separatorは、引数を区切る文字を指定します。デフォルトは&です。第四引数$encoding_typeは、エンコードタイプを指定します。PHP_QUERY_RFC1738(デフォルト)またはPHP_QUERY_RFC3986を指定できます。
このサンプルコードでは、http_build_queryとjson_encodeの使い分けを示しています。http_build_queryは、連想配列をURLエンコードされた文字列に変換します。一方、json_encodeは、配列をJSON形式の文字列に変換します。json_encodeを使用すると、複雑なデータ構造を表現できます。また、JSON_UNESCAPED_UNICODEオプションを使用することで、日本語などのUnicode文字をエスケープせずにJSON文字列に含めることができます。json_decode関数は、JSON形式の文字列をPHPの配列に変換します。
http_build_query関数を使用することで、URLに含めるパラメータを簡単に生成できます。
http_build_queryは、URLにパラメータを付加する際に便利ですが、多次元配列を扱う場合や、複雑なデータ構造を扱う場合は、意図しない結果になることがあります。json_encodeは、より複雑なデータ構造をJSON形式に変換するのに適しており、JavaScriptなど他の言語との連携も容易です。
http_build_queryのencoding_type引数は、URLエンコードの方式を指定します。PHP_QUERY_RFC3986は、より厳密なRFC3986に準拠したエンコードを行います。
json_encodeを使用する際は、JSON_UNESCAPED_UNICODEフラグを指定することで、日本語などのマルチバイト文字をエスケープせずにJSONに含めることができます。json_decodeでJSON文字列を配列に戻す場合、第二引数にtrueを指定する必要があります。セキュリティ上の理由から、json_decodeでデコードするJSON文字列は信頼できるソースからのものに限るようにしてください。
PHP http_build_query で配列をクエリ文字列に変換する
1<?php 2 3/** 4 * http_build_query関数の基本的な使用例 5 * 配列をURLエンコードされたクエリ文字列に変換します。 6 * システムエンジニアを目指す初心者にも理解しやすいように、一般的な使用方法を示します。 7 */ 8 9// URLクエリ文字列に変換したいデータを連想配列として定義 10// ここでは、Webフォームの送信データやAPIリクエストのパラメータを想定しています。 11$params = [ 12 'name' => '山田 太郎', // 日本語も自動的にURLエンコードされます 13 'email' => 'taro.yamada@example.com', 14 'age' => 30, 15 'interests' => ['プログラミング', '読書'], // 配列内の配列も適切に処理されます 16 'options' => [ 17 'newsletter' => true, // 真偽値は 1 または 0 に変換されます 18 'notifications' => false, 19 ], 20 // 数値キーの配列も処理されますが、通常は連想配列を使用することが多いです 21 // 'items' => ['apple', 'banana'], 22]; 23 24// http_build_query関数を呼び出して、配列をクエリ文字列に変換します。 25// 26// 引数: 27// 1. $data (array|object): 変換したい配列またはオブジェクト。 28// 2. $numeric_prefix (string, オプション): 数値キーに付加するプレフィックス。通常は空文字 ('') を指定します。 29// 3. $arg_separator (string|null, オプション): 引数間のセパレータ。null の場合、デフォルトの '&' が使用されます。 30// 4. $encoding_type (int, オプション): エンコーディングの種類。PHP_QUERY_RFC1738 (デフォルト) が一般的です。 31$queryString = http_build_query($params); 32 33echo "生成されたURLクエリ文字列:\n"; 34echo $queryString . "\n\n"; 35 36// 生成されたクエリ文字列を実際のURLに組み込む例 37$baseUrl = 'https://api.example.com/search'; 38$fullUrl = $baseUrl . '?' . $queryString; 39 40echo "完全なURLの例:\n"; 41echo $fullUrl . "\n"; 42 43/* 44上記のコードを実行すると、以下のような出力が得られます: 45 46生成されたURLクエリ文字列: 47name=%E5%B1%B1%E7%94%B0+%E5%A4%AA%E9%83%8E&email=taro.yamada%40example.com&age=30&interests%5B0%5D=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&interests%5B1%5D=%E8%AA%AD%E6%9B%B8&options%5Bnewsletter%5D=1&options%5Bnotifications%5D=0 48 49完全なURLの例: 50https://api.example.com/search?name=%E5%B1%B1%E7%94%B0+%E5%A4%AA%E9%83%8E&email=taro.yamada%40example.com&age=30&interests%5B0%5D=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&interests%5B1%5D=%E8%AA%AD%E6%9B%B8&options%5Bnewsletter%5D=1&options%5Bnotifications%5D=0 51*/
PHPのhttp_build_query関数は、配列やオブジェクトをURLエンコードされたクエリ文字列に変換するために使われます。Webフォームの送信データやAPIリクエストのパラメータなど、プログラムで扱うデータをURLに含める形式に簡単に整形できます。
このサンプルコードでは、名前やメールアドレス、年齢、趣味などの情報を含む連想配列$paramsを用意しています。http_build_query関数にこの配列を渡すと、name=%E5%B1%B1%E7%94%B0+%E5%A4%AA%E9%83%8E&email=taro.yamada%40example.com&age=30...のようなURLクエリ文字列が生成されます。日本語などの特殊文字は自動的にURLエンコードされ、配列内の配列や真偽値も適切に処理されてクエリ文字列に組み込まれます。
関数の第一引数$dataには、変換したい配列やオブジェクトを指定します。この関数は、URLエンコードされたクエリ文字列を文字列として返します。$numeric_prefix、$arg_separator、$encoding_typeといったオプションの引数もありますが、これらは通常、デフォルトの挙動で利用されることがほとんどです。
生成されたクエリ文字列は、ベースとなるURLに続けて結合することで、APIリクエストなどに利用する完全なURLを簡単に構築できます。これにより、複雑なパラメータをURLとして安全かつ正確に渡すことが可能になります。
http_build_query関数は、配列やオブジェクトのデータをURLクエリ文字列形式に変換し、特殊文字や日本語を自動的にURLエンコードします。多次元配列や連想配列は、PHPがWebフォームデータを受け取るような形式に処理されるため、データ構造が複雑な場合も便利です。特に注意すべきは、ブーリアン値(true/false)がそれぞれ1と0に変換される点です。データの受け取り側でこの変換を意識して処理してください。この関数はURLエンコードを行いますが、SQLインジェクション対策などのセキュリティサニタイズ機能は含まれていません。生成されたクエリ文字列をデータベースに格納したり、ユーザー入力として扱う場合は、別途適切なサニタイズ処理を施すようにしてください。引数によってセパレータやエンコーディング方式を変更できるため、連携するAPIの仕様に合わせて調整することも可能です。
PHP http_build_query でクエリ文字列を生成する
1<?php 2 3/** 4 * http_build_query 関数の使用例を示します。 5 * この関数は、データ配列からURLエンコードされたクエリ文字列を生成します。 6 * キーワード「without url encoding」に関して、http_build_query は常に値をURLエンコードしますが、 7 * `encoding_type` パラメータによってスペースのエンコード形式を制御できます。 8 * PHP_QUERY_RFC1738 (デフォルト) はスペースを '+' に、PHP_QUERY_RFC3986 はスペースを '%20' にエンコードします。 9 */ 10function buildAndDisplayQueryStrings(): void 11{ 12 // クエリ文字列に変換するデータ 13 $data = [ 14 'name' => 'John Doe', 15 'city' => 'New York', 16 'query' => 'search for spaces & special chars', 17 'tags' => ['php', 'web development'], 18 ]; 19 20 echo "--- デフォルトのエンコーディング (PHP_QUERY_RFC1738) ---\n"; 21 // デフォルトのエンコーディング (PHP_QUERY_RFC1738): スペースは '+' にエンコードされます。 22 $defaultEncodedQuery = http_build_query($data); 23 echo "出力 (RFC1738): " . $defaultEncodedQuery . "\n\n"; 24 25 echo "--- RFC 3986 形式のエンコーディング (PHP_QUERY_RFC3986) ---\n"; 26 // RFC 3986 形式のエンコーディング: スペースは '%20' にエンコードされます。 27 // 「URLエンコーディングなし」という意図が、RFC 1738の '+' ではなく '%20' を望む場合、 28 // このオプションが最も関連します。完全にエンコーディングをしないわけではありません。 29 $rfc3986EncodedQuery = http_build_query($data, '', null, PHP_QUERY_RFC3986); 30 echo "出力 (RFC3986): " . $rfc3986EncodedQuery . "\n\n"; 31 32 echo "--- 注意点 ---\n"; 33 echo "http_build_query 関数は、引数の値を常にURLエンコードします。\n"; 34 echo "「URLエンコーディングなし」という要件は、この関数では直接達成できません。\n"; 35 echo "encoding_type パラメータは、主にスペースのエンコード形式を制御するためのものです。\n"; 36 echo "その他の特殊文字 ('&', '=', '/', '?') などは、どちらの形式でもURLエンコードされます。\n"; 37} 38 39// 関数を実行して結果を表示 40buildAndDisplayQueryStrings();
http_build_query関数は、PHPで連想配列やオブジェクトのデータを、URLのクエリ文字列形式に変換するために使用します。例えば、ウェブサイトで検索条件をURLに含めたり、APIへリクエストを送る際のパラメータを生成したりする際に便利です。
この関数は、第一引数 $data に指定された配列やオブジェクトの各要素を「キー=値」の形式で連結し、それらをアンパサンド (&) で区切って一つの文字列として返します。このとき、自動的にURLエンコードが行われます。
第四引数 $encoding_type を使用することで、スペース文字のエンコード形式を制御できます。デフォルトでは PHP_QUERY_RFC1738 が適用され、スペースは + に変換されます。一方、PHP_QUERY_RFC3986 を指定すると、スペースは %20 としてエンコードされます。
サンプルコードでは、同じデータに対してこれら二つのエンコーディングタイプを適用し、その結果の違いを示しています。これにより、クエリ文字列内のスペースがどのように変換されるかを確認できます。この関数は、引数の値を常にURLエンコードするため、「URLエンコーディングなし」という要件を直接満たすことはできません。encoding_typeは主にスペースの扱いを調整するためのものであり、その他の特殊文字はどちらのエンコーディングタイプでも適切にURLエンコードされる点にご注意ください。
http_build_query関数は、指定された配列やオブジェクトの値を常にURLエンコードしてクエリ文字列を生成します。キーワードにある「URLエンコーディングなし」という要件は、この関数では直接実現できませんので注意が必要です。encoding_typeパラメータは、主にスペースのエンコード形式を+(PHP_QUERY_RFC1738)か%20(PHP_QUERY_RFC3986)にするかを制御するためのものであり、エンコード自体を無効にするものではありません。&や=などの他の特殊文字も、どちらの形式でも適切にURLエンコードされます。この関数はウェブアプリケーションで安全なURLを構築する際に役立ちますが、値が完全にエンコードされないと誤解しないようにしましょう。