はじめに
http_build_query() は、配列をURLクエリ文字列に変換する便利な関数です。
ただし、エンコードルール(空白→+ か %20 か)や特殊文字の扱いを正しく理解していないと、出力結果を見て「なぜこうなるの?」と戸惑うことも。
今回はPHP8上級試験の例題をベースに、エンコード処理の流れと仕様の違いをわかりやすく整理します。
目次
🧩 コード例
<?php
declare(strict_types=1);
error_reporting(-1);
$params = [
'id' => 'id string',
'pass' => 'p&a=ss',
];
$q = http_build_query($params);
var_dump($q);🧾 出力結果
string(28) "id=id+string&pass=p%26a%3Dss"この出力は正しい動作です。では、なぜこのような文字列になるのかを順に見ていきましょう。
🔍 http_build_query() の基本仕様
http_build_query() は、連想配列をURLクエリ文字列に変換する関数です。
http_build_query(
array $data,
string $numeric_prefix = "",
string $arg_separator = "&",
int $encoding_type = PHP_QUERY_RFC1738
): string✅ 主な役割
- 各キーと値を
key=valueの形式に整形 - 値を URLエンコード して安全に送信できる文字列へ変換
&でパラメータを連結する
⚙️ 各値がどのように変換されるか
| 元の値 | エンコード後 | 備考 |
|---|---|---|
'id string' | 'id+string' | 空白( )は + に変換される |
'p&a=ss' | 'p%26a%3Dss' | & → %26、= → %3D |
結果として:
id=id+string&pass=p%26a%3Dssというクエリ文字列になります。
💡 RFC指定による違い
実は、空白をどうエンコードするかは「エンコードタイプ」で変わります。
| オプション | 内容 | 空白の扱い | 出力例 |
|---|---|---|---|
PHP_QUERY_RFC1738(デフォルト) | 通常のWeb互換 | + | id=id+string |
PHP_QUERY_RFC3986 | RFC3986準拠 | %20 | id=id%20string |
例:
echo http_build_query($params, '', '&', PHP_QUERY_RFC3986);
// 出力: id=id%20string&pass=p%26a%3Dss🧭 図解:エンコードの流れ
$params = [
'id' => 'id string',
'pass' => 'p&a=ss'
];
│
▼
[1] キーと値のペアに分解
→ id=id string
→ pass=p&a=ss
│
▼
[2] URLエンコード処理
→ id=id+string
→ pass=p%26a%3Dss
│
▼
[3] &で連結
→ id=id+string&pass=p%26a%3Dss🧩 まとめ
| 項目 | 内容 |
|---|---|
| 関数名 | http_build_query() |
| 目的 | 配列をURLエンコード済みのクエリ文字列へ変換 |
| デフォルト仕様 | RFC1738(空白→+) |
| 特殊文字 | &→%26、=→%3D |
| 試験ポイント | エンコード結果が "id=id+string&pass=p%26a%3Dss" になるのは正しい |
