JSで作った多次元配列をPOSTでPHPに渡す方法

JavaScriptで作った多次元連想配列をPOSTでPHPに渡そうと思って以下のように書いた。

var data = $('fieldset');//複数のfieldset
var schedule_data = [];
schedule_data[] = [];
for(i=0; i < data.length; i++) {
    schedule_data[i]["mon"] = $(data[i]).find(".mon").val();
    schedule_data[i]["tue"] = $(data[i]).find(".tue").val();
    schedule_data[i]["wed"] = $(data[i]).find(".wed").val();
    schedule_data[i]["thu"] = $(data[i]).find(".thu").val();
    schedule_data[i]["fri"] = $(data[i]).find(".fri").val();
    schedule_data[i]["sat"] = $(data[i]).find(".sat").val();
    schedule_data[i]["sun"] = $(data[i]).find(".sun").val();
}
$('#schedule_data').val(schedule_data);//hiddenに格納

しかしこれが大誤算だった。

PHP側で、

$_POST["schedule_data"]

なんて気軽に取ろうと思ったら、
なんと中身が無い!(展開すると”,,,”って出る。)

どうやらPOSTの仕様上多次元配列は取れないらしい。
連想配列を使わなくても同じ結果に。

それならばjQueryでJSON化して渡そうと、

    $.ajax({
        url: "/schedule.php",
        dataType: 'text',
        type:"POST",
        data: {
            "schedule_data": schedule_data
        }
    });

これも同じ結果。

だがこちらは連想配列を使わなければ綺麗に値が入った!

しかし連想配列をどうしても使いたい。

そこで調べた結果出てきたエントリーがこれ。
http://bakabaka.net/blog/archives/post-327.html
nameに多次元配列のハッシュを持たせればなんとか取れそう。

早速以下のようにhiddenを作ってみると、

$('<input>').attr({type:'hidden',name:'schedule_data[' + i + '][mon]',value:$(data[i]).find(".mon").val();}).appendTo('#form');
$('<input>').attr({type:'hidden',name:'schedule_data[' + i + '][tue]',value:$(data[i]).find(".tue").val();}).appendTo('#form');
...以下略

PHPでjson_encode。

json_encode($postValue["schedule_data"]);

結果。

[{"mon":"","tue":"1","wed":"1","thu":"1","fri":"","sat":"","sun":""},
{{"mon":"","tue":"","wed":"","thu":"","fri":"","sat":"","sun":""}]


素晴らしい!!!

ちなみに、
http://d.hatena.ne.jp/Fivestar/20080518/1211125500
こんなエントリーもありましたが、

params = {
  'A[a1]': 'a1',
  'A[a2]': 'a2',
  'B': 'b'
}

これの作り方が分からず投了。

あわせて読みたい

コメントを残す