【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と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_queryjson_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_queryencoding_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 * 配列をクエリ文字列に変換し、それを元の配列に戻す例
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)。

このサンプルコードでは、まず連想配列$datahttp_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形式に適しています。

関連コンテンツ