PHPにおけるJSONや配列からFormData形式(URLクエリ)への変換方法

データの形式変換が必要な背景

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_POSTFIELDShttp_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 を通して文字列化することが重要です。

タグ: PHP JSON http_build_query WebAPI FormData

8月13日 06:03 投稿