http_build_queryで空文字を送信する

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
空文字…じゃなくて空に文字

この記事を三行にまとめると

http_build_queryに関するお話
値を空にして送信したい場合
「''」を使えってことですね
http_build_queryで配列からクエリ文字列を作成する場合の話です。

普通はこんな感じになる。

$array = array(
  'key1' => 'value1',
  'key2' => 'value2',
);
$query = http_build_query($array);
echo $query;

//生成されるクエリ
key1=value1&key2=value2

ではここで値を空にして送信したい場合、どのパターンならいけるか。「false」「null」「”」「array()」の4パターンに対してhttp_buil_queryを使うとこんなクエリ文字になります。

$array = array(
  'key1' => false,
  'key2' => null,
  'key3' => '',
  'key4' => array(),
);
$query = http_build_query($array);
echo $query;

//生成されるクエリ
key1=0&key3=

nullやarray()はクエリ文字から除外されてしまいます。falseはブール代数的に0なので0になる。だからキーだけ渡したい場合は「”」を使えってことですね。



ちょいおまけの話。

curlを使って多次元配列のデータをPOSTする際、データが「Array」という文字列になってしまうことがあるかと思います。

$post = array(
  'key1' => 'value1',
  'key2' => array('aaa', 'bbb'),
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_URL, '送信先のURL');
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_exec($ch);
curl_close($ch);

//key2のArrayが文字列になっている
Array(
  [key1] => value1
  [key2] => Array
)

こういうときは「key2[aaa]」みたい明示的なキーの書き方をしてのも良いのですが、配列が複雑になる可能性があるならhttp_build_queryを使う方が手っ取り早いと思います。

//明示的に書く場合
$post = array(
  'key1' => 'value1',
  'key2[aaa]' => 'bbb',
);

//http_build_queryを使う場合
$post = array(
  'key1' => 'value1',
  'key2' => array('aaa' => 'bbb'),
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_URL, '送信先のURL');
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
curl_exec($ch);
curl_close($ch);

//key2の中身も配列になっている
Array(
  [key1] => value1
  [key2] => Array(
    [aaa] => bbb
  )
)
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください