• ベストアンサー

javascriptでhiddenに二次元配列を格納したい

現在、Webのシステムでクライアント側のJavaScriptから サーバー側のPHPに値を渡そうと思ってます。 その際に、JavaScriptの配列と連想配列を組み合わせた二次元配列に 値を格納してサーバー側に渡そうと思ってます。 それで以下のような方法を試しているのですが、 hiddenに二次元配列を格納する方法が分からず困ってます。 分かる方がいらしたら教えて頂けますでしょうか。 よろしくお願いいたします。 =========================================== var actionName = document.forms[0].action; var bodyObj = document.body; var formObj = document.createElement("FORM"); var hiddenObj = document.createElement("HIDDEN"); formObj.name = "updateTest"; formObj.action = actionName; formObj.method = "post"; hiddenObj.name = "alltest[][]"; var norArr = new Array(); var hashArr = new Array(); var i = 1; hashArr['test'] = document.getElementById("test" + i).value; norArr[i-1] = hashArr; hiddenObj.value = hashArr; formObj.appendChild(hiddenObj); bobyObj.appendChild(formObj); formObj.submit();

  • jjin
  • お礼率70% (7/10)

質問者が選んだベストアンサー

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.2

createElement("HIDDEN"); を使っているという事はIE専用のシステムだと思っていいですね?(※1) IEではname属性を後からつける事ができません。(つける事はできるけど、それが反映されなかったりする。※2) なのでcreateの時点でタグの文字列を渡してnameを付けます。 createElement("<INPUT type=HIDDEN name=alltest[][]>"); ただ、 alltest[][]というのはphpでは配列として扱えるかもしれませんが、javascriptにとっては変数(配列)ではなく、ただの名称に過ぎませんので、phpでそのまま使える配列を渡すというのは無理だと思います。 phpの事はわからないのであまり具体的な回答はできませんが、 配列を渡したければ、値の組み合わせを文字列として渡してphp内できちんとパースするか、 配列定義のコードを文字列として渡し、evalで実行するとか。 に、なると思います。 (evalで実行するコードは汚染チェックが必要なので充分注意が必要です、むしろ面倒になる気がする。) ※1 createElementに要素名以外の開始タグやinputのtypeを渡して、とかいう妙な動作が可能なのはIEだけです。 ※2 name以外に、type属性もradioは設定できないとか、これまた珍妙なバグもあります。

jjin
質問者

お礼

steel_grayさん、返答ありがとうございます。 JavaScriptに関しては、詳しくないので createElement("HIDDEN"); がIE専用とは知りませんでした。 >値の組み合わせを文字列として渡してphp内できちんとパースするか なるほど、こういう方法もあるのですね。 試してみたいと思います。

その他の回答 (6)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.7

受け取り側がPHPなら配列っぽく渡せば、いけるんじゃないかなぁ・・・ こんなかんじでわかります? <? $all=$_REQUEST["all"]; if(is_array($all)) print_r($all); ?> <script type="text/javascript"> function hoge(f){ /* all[1][2]="a"; all[1][3]="b"; all[4][5]="c"; all[4][6]="d"; とします */ var all={1:{2:'a',3:'b'},4:{5:'c',6:'d'}}; for(var i in all){ var obj=all[i]; for(var j in obj){ var tag=document.createElement("input"); tag.setAttribute("type","hidden"); tag.setAttribute("name","all["+i+"]["+j+"]"); tag.setAttribute("value",obj[j]); f.appendChild(tag); } } return true; } </script> <form method="get" onsubmit="return hoge(this)"> <input type="submit" value="go"> </form>

  • leap_day
  • ベストアンサー率60% (338/561)
回答No.6

こんにちは hiddenObj.value = hashArr;になっていたのでvalue値に配列を入れるのかと思っていました・・・ hashArr = ["id=test1.value","id=test2.vaue"] になってるので1次元配列ですね(--;) <form action="****"> <input type="text" id="test1"> <input type="text" id="test2"> <input type="text" id="sample1"> <input type="text" id="sample2"> </form> の形になっていて hashArr0 = ["test1.value","test2.value"]; hashArr1 = ["sample1.value","sample2.value"]; という風にして norArr = [["test1.value","test1.value"],["sample1.value",sample2.value"]]; にして #3のような形で吐き出したいということでしょうか? <script type="text/javascript"><!-- function r() { var actionName = document.forms[0].action; var bodyObj = document.body; var formObj = document.createElement("FORM"); formObj.name = "updateTest"; formObj.action = actionName; formObj.method = "post"; var norArr = new Array(); var test = new Array(); var samp = new Array(); for(i=1;i<3;i++) { test[i-1] = document.getElementById("test" + i).value; } for(i=1;i<3;i++) { samp[i-1] = document.getElementById("sample" + i).value; } norArr[0] = test; norArr[1] = samp; for(i=0;i<norArr.length;i++) { for(j=0;j<norArr[i].length;j++) { var hiddenObj = document.createElement("input"); hiddenObj.type = "hidden"; hiddenObj.name = "all"+i+j; hiddenObj.value = norArr[i][j]; formObj.appendChild(hiddenObj); } } bodyObj.appendChild(formObj); formObj.submit(); } //--></script> <form action="test.cgi" onsubmit="return false;"> <input type="text" id="test1"> <input type="text" id="test2"> <input type="text" id="sample1"> <input type="text" id="sample2"> </form> <input type="button" value="送信" onclick="r()"> ※onsubmit="return false;"はOperaでテキストフィールド内でreturn keyを押すと送信されちゃったので念のために入れてます ※formObj.method = "get";にしたり hiddenObj.type = "hidden"; formObj.submit();を削除したりすれば どのように生成されたとかどんな形で送信しているかとか見ることができますよ

jjin
質問者

お礼

leap_dayさん、返答ありがとうございます。 まさにこのような方法をやりたいと思ってました。 でも、steel_grayさんが言われたように 配列として渡せないみたいなんですね。 ですので、「値の組み合わせを文字列として渡してphp内できちんとパースする」 という方法で取得しようと考えています。 どうもありがとうございました。

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.5

#2,#3です。 「元の渡したい配列」、というのがよくわからんので 具体的なコードはかけません。 Javascript部分より、むしろHTML部分を補足してもらって HTML中の、この部分をこういうルールで二次元配列にして渡したい。 とか聞いてもらったほうがわかるかも?

jjin
質問者

お礼

steel_grayさん、度々回答ありがとうございます。 #2の回答をもう一度読み直していたら自分が間違った理解を してましたので、もう一度頭の中を整理して試してみたいと 思います。 また、分からなければご質問するかもしれませんが、 よろしくお願い致します。

  • leap_day
  • ベストアンサー率60% (338/561)
回答No.4

こんにちは var hiddenObj = document.createElement("HIDDEN");  →var hiddenObj = document.createElement("input");  →hiddenObj.type = "hidden"; hiddenObj.value = hashArr;  →hiddenObj.value = hashArr['test']; bobyObj.appendChild(formObj);  →bodyObj.appendChild(formObj); では? もしくは var hashArr = new Array(); for(i=1;i<3;i++) { hashArr[i-1] = document.getElementById("test" + i).value; } hiddenObj.value = hashArr; ※i<3;はid="test*"にあわせてください 上記は <form action="****"> <input type="text" id="test1"> <input type="text" id="test2"> </form> の場合

jjin
質問者

補足

leap_dayさん、回答ありがとうございます。 leap_dayさんの記述は、1次元配列の格納の場合でしょうか? 自分が知識不足かもしれませんが。 よろしくお願い致します。

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.3

#2です、ちょっと追加。 #1さんのおっしゃるような方法ももちろん可能です。 下記のようにhidden項目を生成する。 <INPUT type=HIDDEN name=alltest[0][0] value="a"> <INPUT type=HIDDEN name=alltest[0][1] value="b"> <INPUT type=HIDDEN name=alltest[1][0] value="c"> <INPUT type=HIDDEN name=alltest[1][1] value="d">

jjin
質問者

補足

steel_grayさん、再度の回答ありがとうございます。 yambejpさんの言われた方法、つまり上記のようになるように JavaScriptで記述できるのが理想なのですが、 現在の自分の技術で上手く生成できないのですが、 良ければ具体的な記述を教えて頂けますでしょうか。 よろしくお願いいたします。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

var hiddenObj = document.createElement("HIDDEN"); は、とりあえずこうした方がよいのでは? var hiddenObj = document.createElement("INPUT"); hiddenObj.setAttribute("type","hidden"); で、2次配列の状態で渡すのであれば そうなるようhiddenObjをかいて、formObjに複数回appendChildして やればいいでしょう

jjin
質問者

お礼

yamabejpさん、返答ありがとうございます。 まず、 var hiddenObj = document.createElement("HIDDEN"); の記述間違ってました。 修正ありがとうございます。

関連するQ&A

  • javascriptで困っています。教えてください

    JavaScriptで配列をPOST送信しようとしています。 <form>や<input>を作っておいてではなく、javascriptで生成する関数からしたいと思っています。以下のコードでうまくいきません。 教えていただければありがたいです。よろしくお願いします。 <!DOCTYPE html> <html> <head> <script type="text/javascript"> var ar = new Array(5); ar[0] = 111; ar[1] = 222; ar[2] = 333; ar[3] = 444; ar[4] = 555; function sampleForm(value){ var form = document.createElement('form'); document.body.appendChild( form ); var input = document.createElement('input'); input.setAttribute('type','hidden'); input.setAttribute('name','hidden_input'); input.setAttribute('value', value); form.appendChild(input); form.setAttribute('action','send.php'); form.setAttribute('method','post'); form.submit(); } </script> </head> <body> <a href=“javascript:sampleForm(ar)”>クリックしたら“samplepost”をPOST送信</a> </body> </html> send.php-------------------------------- <?php $num = isset($_POST['hidden_input']) ? $_POST['hidden_input'] : null; print "num: " . $num; ?>

  • JavaScriptで2次元配列を扱う方法

    C言語を少しだけやっていました。 JavaScriptで2次元配列作りたいのですが、上手くいきません。 var array[5][5]; array[0][0] = 21; document.write(array[0][0]); ↑を実行しても「21」と表示されません。 new array()とか色々試しましたが上手くいかないので質問させていただきました。 教えてください!

  • 配列の格納

    現在、PHPで生成したhiddenフィールドに、Valueを設定しない記述(配列のような形式)を行い、JavaScriptにて値を代入するプログラムを作っています。 エラーは出ていないようなのですが、値が代入されません。Alertでみると、undefinedというメッセージが出ています。hiddenフィールドへの格納方法をご教授ください。 <ソース>(抄) function user_num() { var i=1,l=0, num = document.getElementById('users').length; document.user_select.user_no =new Array(num); while(num > 0){ document.getElementsByName('user_no[i]').value = document.getElementById('users').options[l].value; alert(document.getElementsByName('user_no[i]').value); num--; i++; l++; } } (中略) hiddenフィールド生成文 <?php $n=1; while($i){ print '<input type="hidden" name="user_no['; print $n; print ']"'; print ' id="user_no['; print $n; print ']">'; $i=$i-1; $n=$n+1; } ?>

  • 多次元配列への格納

    よろしくお願いします。 多次元配列に値を格納したいのですが、これまでは、 $test = array ( 'father' => array ('hiroshi', 'toshi'), 'mother' => array ('hanako', 'yoshiko'), ); のように予め書かれてあるデータを使ってきましたが、この度やりたいのはある一つの通常の配列を20ずつ多次元配列に自動的に格納するスクリプトを作りたいと思っています。 $test = array ('hiroshi','toshi','masao',.....);と続く配列を、 $test = array ( 0 => array ('hiroshi',......(20個)), 1 => array (.......), ); と20ぐらいに区切って多次元配列にしたいです。 $test[0]に直接pushしたらWarning: array_push() [function.array-push]: First argument should be an array in..と叱られてしまいました。 どなたかわかる方がいましたらおしえてください。

    • ベストアンサー
    • PHP
  • hiddenを動的に作成したい

    何度も呼ばれるfunction(testfunc)があり、ここではparamaterというフィールドがあればそこに値を設定し、なければparamaterというhiddenフィールドを作成し、そのフィールドに値を作成。 その後、Ajax.Requestを使用して値をサーバに渡したいです。 下記のように作成しましたが、createhidden実行後もformobj.paramaterはundefinedになってしまいます。 ただ、実際は作成されているようで、サーバーには最初に設定した値が何度も飛んできている状態です。(同じnameのhiddenがたくさんできている状態?) 特にこの方法にこだわる事はないので、もっといい方法があればそれでも構いません。(post時に別のやり方?で値を渡すなど) 尚、最初からhtmlにhiddenを書いておくというのは無しでお願い致します。 function testfunc (value) { formobj = document.forms[0]; if (formobj.paramater) { formobj.paramater.value = value; } else { createhidden('paramater', value, formobj); } new Ajax.Request('./Suggest.do', { // 正しく補完情報を取得できた場合 onSuccess: aaaa, onFailure: bbbb, postBody: Form.serialize(formobj), asynchronous: true, method: 'post' }); } function createhidden( name, value, form ){ var elm = document.createElement('input'); elm.type = 'hidden'; elm.name = name; elm.value = value; form.appendChild(elm); }

  • 配列の受け渡し

    失礼致します。 配列について困っていまして、質問させてください。 今、フォームデータとしてsubmitを押したときにjavascriptから配列をサーブレットに受け渡ししたいです。フォームを含めたソースは次のようになります。 <script> function submitArr(n) { var i = 0; var array = []; while(i<n) { array.push(variable); // variableはiの値に応じて変わる変数。 } document.frm.array.value = array; ☆ } </script> <form action="servlet" method="post" name="frm"> <input type = "submit" value = "submit" onClick="submitArr()"> <input type = "hidden" value = "" name="array"> ☆ </form> 次に、servlet側でこれを受け取ります。 String[] array = new String[n]; ★ while(i<n) { array[i] = req.getParameter(array[i]); ★ } 以上が本質的な部分だと思うのですが、☆および★の部分をどう書いたらいいかわかりません。 添え字も少しあやふやなのですが、 分かる人がおられましたら、教えていただけないでしょうか?

    • ベストアンサー
    • Java
  • テキストを多次元配列に格納したい

    $text="1;2;3:4;5;6:7;8;9:10;11;12:…"; $tmp = split(":",$text); これでtmpで格納された1;2;3、4;5;6、7;8;9、10;11;12をさらに分けて、多次元配列で格納しようと思います。 すなわち多次元配列"arrayについて、 print_r($array[0])の出力結果がArray ( [0] => 1 [1] => 2 [2] => 3 ) print_r($array[2])の出力結果がArray ( [0] => 7 [1] => 8 [2] => 9 ) となるような感じです。 しかし自分ではtmpからarrayへの変換がうまくいきません。 どなたかこのような働きをするコードを教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • JavaScriptでの動的な多次元配列の生成方法

    JavaScriptで多次元配列を生成する方法を教えて頂きたく思います。 現在下記の様なコードを作成しています。 resArrayNowという多次元配列を作っておいて、[name][point1][point2] というnx3次元配列を動的に作成したいと思っています。 しかし、下記の様なプログラムを作成したところ、 if(resArrayNow.length==0){ の中入ったところで、実行されなくなっているようで上手くいきません。 どなたか、JavaScriptの多次元配列を動的に作成していく方法をご教授下さい。 宜しくお願いいたします。 ----------------------------------------------------------------------- var resArrayNow = Array(); arrayAdd("tom,1,45"); arrayAdd("ken,2,61"); arrayAdd("mike,33,5"); function arrayAdd(msg){ // カンマで分割し配列に格納 var resArray = msg.split(","); /*resArrayNowに格納されているIPアドレスと同じアドレスからのメッセージ * だった場合はx,yの値を更新、アドレスがなかった場合は新たに配列を追加する */ if(resArrayNow.length==0){ resArrayNow[0][0]=resArray[0]; resArrayNow[0][1]=resArray[1]; resArrayNow[0][2]=resArray[2]; alert(resArrayNow.length); } else{ for(var i = 0;i < resArrayNow.length;i++){ if(resArrayNow[i][0] == resArray[0]){ resArrayNow[i][1]=resArray[1]; resArrayNow[i][2]=resArray[2]; }else if(i== resArrayNow.length-1){            /*最後までIPアドレスを探して一致するIPが *resArrayNowになかった場合は新たに配列を追加する。 */ resArrayNow[i+1][0]=resArray[0]; resArrayNow[i+1][1]=resArray[1]; resArrayNow[i+1][2]=resArray[2]; } } } }

  • Javascriptで二次元配列で高次元の配列サイズを取得する方法を教えてください。

    Javascriptで二次元配列で高次元の配列サイズを取得する方法を教えてください。 var data = [ [1,2,3], [4,5,6], [7,8,9] ]; for (var i = 0; i < data.length; i++){ for (var j = 0; j < data[i].length; j++){ <--- ここで lengthのオブジェクトがNullというエラーになります。 alert(data[i][j]); } } よろしくお願いいたします。

  • javascriptの2次元配列をソートの仕方

    function word_grouping(data) { var code = data; //先頭についている”code="を除去 code = code.replace("code=",""); var = code.split(","); var alpha =new Array(); alpha = ['A','B','C','D','E','F','G','H','I','J','K','L','M']; //2次元配列作成 var array = new Array(); for (i =0; i < alpha.length; i++) { array[i] = [' ','0']: } //グループ名を格納 for( i = 0; i <alpha.length; i++){ array[i][0] = alpha[i] //0番目の項目から順番にグループごとに分ける for( i = 0; i < sp.length; i++){ group = sp[i].substring(0.1); //どのグループに所属しているか調べる for( j = 0; j < alpha.length; j++){ //一致したグループの配列にカウント+1していく if(group == array[j][0]{ array[j][1]++; } } } メモ ・spにはグループのどこかに所属する20個のキーワードが入っていてそれをグループに振り分けている ・グループ分けには”A001”のAだけみて振り分けています したいこと ・arrayに入ったキーワードの数を降順で並び替えたい 分からない所 ・2次元配列をsortする仕方 こんな感じなんです わかる方回答お願いします。

専門家に質問してみよう