データの形式変換が必要な背景
Webアプリケーションの開発において、サーバー間でデータを送信したり、APIクライアントから特定のリクエストを投げたりする際、データのフォーマット変換は避けて通れません。特にPHPでは、内部で扱う「連想配列」や標準的な「JSON」形式を、application/x-www-form-urlencoded(いわゆるFormData形式の文字列)に変換して送信するケースが多々あります。
http_build_query関数による配列の変換
PHPには、配列をURLエンコードされたクエリ文字列に変換するための標準関数 http_build_query() が用意されています。これを利用することで、手動で文字列を連結する手間を省き、特殊文字のエンコーディングも自動で行えます。
// 変換対象の連想配列
$user_profile = [
'username' => 'dev_user',
'access_level' => 5,
'preferences' => ['theme' => 'dark', 'notifications' => true]
];
// FormData形式(クエリ文字列)に変換
$form_encoded_data = http_build_query($user_profile);
// 出力結果: username=dev_user&access_level=5&preferences%5Btheme%5D=dark&preferences%5Bnotifications%5D=1
echo $form_encoded_data;
この関数は、多次元配列(ネストされた配列)にも対応しており、ブラウザがフォームを送信する際と同じ形式のキー(例: preferences[theme])を自動生成します。
JSON文字列をFormData形式に変換する
外部APIから受け取ったJSONデータや、フロントエンドから送られてきたJSONを再度別のサービスへ転送する場合、一度PHPの配列にデコードしてから変換処理を行います。
// 入力となるJSONデータ
$json_input = '{"service_id": 1024, "action": "update_status", "tags": ["php", "api"]}';
// 1. JSONを連想配列に変換
$data_array = json_decode($json_input, true);
if ($data_array !== null) {
// 2. 配列をFormData形式に変換
$post_fields = http_build_query($data_array);
// この$post_fieldsをcURLなどのボディとして利用可能
echo $post_fields;
}
cURLを利用した送信例
変換したデータを実際にPOSTリクエストとして送信する際の、PHP cURLを用いた実装コードを紹介します。CURLOPT_POSTFIELDS に http_build_query の結果を渡すことで、適切なContent-Typeで送信されます。
$endpoint = 'https://api.example.com/v1/resource';
$params = [
'api_key' => 'secret_token_123',
'payload' => 'sample_content'
];
$ch = curl_init($endpoint);
curl_setopt($ch, CURLOPT_POST, true);
// 文字列として渡すことで application/x-www-form-urlencoded と認識される
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
なお、CURLOPT_POSTFIELDS に配列をそのまま渡すと、cURLは multipart/form-data として送信しようとします。送信先サーバーが application/x-www-form-urlencoded を期待している場合は、必ず http_build_query を通して文字列化することが重要です。