空の配列を POST すると消える
試しに、jQuery の $.ajax を使い、
ブラウザから以下のようなデータをサーバに POST してみます。
$.ajax({
cache: false,
type: 'POST',
url: 'api.php',
dataType: 'jsonp',
jsonpCallback: 'callback',
data: {
'arg1': 123,
'arg2': 'abc',
'arg3': [1,2,3],
'arg4': {'a':'abc', 'A':'ABC'},
'arg5': []
}
});
以下のようにして、サーバ側で POST された
データを PHP を使って表示してみます。
print_r($_POST);
すると、以下のような結果が得られます。
Array ( [arg1] => 123 [arg2] => abc [arg3] => Array ( [0] => 1 [1] => 2 [2] => 3 ) [arg4] => Array ( [a] => abc [A] => ABC ) )
数字、文字列、中身のある配列、ハッシュ (辞書)
などは、問題なく POST いることが見て取れます。
しかし、‘arg5’: [] に関する部分は
消えて無くなっていることが分かります。
もう少しだけ内情を把握するために
ブラウザの Developer Tools (開発者ツール) を
使用して、送信したデータを見てみると、
以下のような状態となっています。
ちょっと、一見して把握しにくいので、
パースされた (分かりやすくした) データ表記で見ると
以下のような形になっています。
これらから、サーバに送信するデータとして、
‘arg5’: [] に関する部分が含まれていないことが分かります。
対処方法
対処方法は色々あるのですが、
ここでは簡単でシンプルなものを 1つご紹介します。
0個か、1個か、あるいは複数か、
要素数がいくつであっても対応できるように、
このような場面では POST するデータは 常に配列 として、
これをループ的に処理するのではないかと思います。
そうであるなら、以下のように
サーバ側でキャスト (型変換) すれば対処できます。
$_POST['arg5'] = (array)$_POST['arg5'];
print_r($_POST);
データには型というものがあります。
型とは大雑把に言えば、数値、文字、配列などの形式のことです。
例えば、文字の ‘00230’ を数字に形式を変換すると 230 となります。
‘abc’ を数字に変換すると 0 となります。
では、存在しない $_POST[‘arg5’] を配列に変換するとどうなるでしょうか。
Array() ([]とも表現できる)、つまり空の配列となります。
もちろん、Array(1,2,3) ([1,2,3]とも表現できる) のような
要素をもつ配列はそのままの状態が維持されます。
そのようなわけで、POST されるデータとして、
常に要素数が 0〜任意個数の配列を想定するのであれば、
空の配列が消えて無くなるという問題に対しては、
これを配列へキャストすることで対処することができきます。
最初の例で言えば、以下のようにキャストすることで問題に対処できます。
$_POST['arg5'] = (array)$_POST['arg5'];
print_r($_POST);
arg3 と arg4 も空になる可能性があるのであれば
以下のようにして、それらもキャストします。
$_POST['arg3'] = (array)$_POST['arg3'];
$_POST['arg4'] = (array)$_POST['arg4'];
$_POST['arg5'] = (array)$_POST['arg5'];
print_r($_POST);
結果は以下のようになります。
Array
(
[arg1] => 123
[arg2] => abc
[arg3] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[arg4] => Array
(
[a] => abc
[A] => ABC
)
[arg5] => Array
(
)
)
ちなみに、NULL、Array() を配列にキャストすると空の配列になりますが、
0、true、false、” などは空の配列にはなりません。
それぞれを配列にキャストした場合にどうなるかを以下に示します。
print_r( (array)(NULL) );
Array ( )
print_r( (array)(array()) );
Array ( )
print_r( (array)(0) );
Array ( [0] => 0 )
print_r( (array)(true) );
Array ( [0] => 1 )
print_r( (array)(false) );
Array ( [0] => )
print_r( (array)(”) );
Array ( [0] => )
以上、問題解決のお役に立てば幸いです。
テスト環境
なお、これらのテストは以下の条件で行いました。
サーバ側
- CentOS 5.x
- Apache 2.2.29
- PHP 5.2.17
クライアント側
- OS X 10.9.5
- Chrome Version 43.0.2357.132 (64-bit)
- jQuery 1.11.3
お問い合わせについて
業務として技術コンサルティングやシステム設計・開発を行っております。
気になることがありましたらご相談下さい。
ご相談のみで完結する場合、コンサルティング費用の目安は
内容によりますが1時間で5千円〜1万円ていどです。
コンサルティングや開発を検討されるその前に、
まずはお気軽にコメントやメールでご連絡下さい。
※ご契約前のコメントやメールでのやりとりは無料です。