• ベストアンサー

多次元配列の値が変わってしまいます

以下のソースでブラウザ出力すると、セレクトボックスの 選択項目が、1号、10号、11号になってしまいます。 ためしに9号を99号にしてみたところ、今度は19号と出力されました。 どこが間違っているのでしょうか? ご教授頂けると幸いです。 <?php $a_size[3][1]="9号";//size $a_size[3][2]="10号";//size $a_size[3][3]="11号";//size $a_size[3][4]="12号";//size $a_size[3][5]="13号";//size $a_size[3][1]["amount"]=1;//amount $a_size[3][2]["amount"]=1;//amount $a_size[3][3]["amount"]=1;//amount $a_size[3][4]["amount"]=0;//amount $a_size[3][5]["amount"]=0;//amount $ii_max=5;//ring size = 9,10,11,12,13 ?> ////////////////////////////////////////////////// 【サイズ】 <select name='a_size' style="height:8; "> <?php if(!$a_size[$i]){ print " <option value=''>---</option>"; }else{ print " <option value=''>選択</option>"; for($ii=1;$ii<=$ii_max;$ii++){ if($a_size[$i][$ii]["amount"]>0){ print " <option value='".$a_size[$i][$ii]."'>".$a_size[$i][$ii]."</option>"; }//END OF IF }//END OF FOR }//END OF IF ELSE ?> </select>

  • PHP
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
回答No.4

$a_size[3][n]="xx号";//size となっているのを、 $a_size[3][n]['size']="xx号";//size にしてください。 また、 print "<option value='".$a_size[$i][$ii]."'>".$a_size[$i][$ii]."</option>"; となっているのを、 print "<option value='".$a_size[$i][$ii]['size']."'>".$a_size[$i][$ii]['size']."</option>"; にしてください。 これでご期待通りの動きをすると思います。 なぜ、ご質問のプログラムでは、うまく動かないのか? については以下を見てください。 $foo = "abcdefg"; $foo[0] = 'X'; echo $foo; // Xbcdefg が出力される $foo[2] = 'Y'; echo $foo; // XbYdefg が出力される $foo["amount"] = 'Z'; echo $foo; // ZbYdefg が出力される PHPは、$fooという変数に文字列が設定される場合、 $foo[0]='X' → 文字列の1番目を'X'に置き換え $foo[2]='Y' → 文字列の3番目を'Y'に置き換え $foo["amount"] = 'Z' → "amount"が数値に変換されて「0」となり、文字列の1番目を'Z'に置き換え のように動作します。 従って、 $a_size[3][1]="9号";//size $a_size[3][1]["amount"]=1;//amount とすると、文字列"9号"の1番目の文字"9"が"1"に置き換えられて、"1号"になります。

sato777
質問者

お礼

正常に動作させる事ができました。 解りやすい解説とご指導、本当に有難うございました。

その他の回答 (3)

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.3

No.2です。一部訂正。 >結果、$a_size[1]の最初の文字を1で上書きすることになっています。 $a_size[3][1]の…、でした。すみません。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

興味深かったので自分でもいろいろ試してみました。 まずは単純な以下のソースを実行してみてください。 <?php $a="ABC"; print $a[0]; ?> A とだけ表示されると思います。$a[0]とすると、$aを配列とみなし、その文字それぞれが配列要素となります。したがって上の場合$a[0]は$aの先頭の文字である"A"になります。逆に、以下のように、$a[0]に値を代入すると、 <?php $a="ABC"; $a[0] = 1; print $a; ?> 結果は 1BC と出ます。$a[0]に値を代入することによって、$aの文字列を部分的に書き換えてしまうようです。 これと同様に、 $a_size[3][1]="9号";//size と定義されているところに、 $a_size[3][1]["amount"]=1;//amount と代入すると、インデックスして文字列を使った場合、裏では0から順番に数字のインデックスが振られるので、上の式は $a_size[3][1][0]=1; と同じことになり、結果、$a_size[1]の最初の文字を1で上書きすることになっています。 対処法としては、amountを示す配列は$amount[3][1]などとして、変数を分ければいいのではないのでしょうか。

sato777
質問者

お礼

正常に動作させる事ができました。 解りやすい解説とご指導、本当に有難うございました。

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

$a_size[3][1]="9号"; ってところを $a_size[3][1]["size"]="9号"; として運用してみてはいかがですか? <?php $a_size[3][1]["size"]="9号";//size $a_size[3][2]["size"]="10号";//size $a_size[3][3]["size"]="11号";//size $a_size[3][4]["size"]="12号";//size $a_size[3][5]["size"]="13号";//size $a_size[3][1]["amount"]=1;//amount $a_size[3][2]["amount"]=1;//amount $a_size[3][3]["amount"]=1;//amount $a_size[3][4]["amount"]=0;//amount $a_size[3][5]["amount"]=0;//amount $ii_max=5;//ring size = 9,10,11,12,13 $i=3; print<<<eof 【サイズ】 <select name='a_size'> eof; if(!$a_size[$i]) print "<option value=''>---</option>"; else{ print "<option value=''>選択</option>\n"; for($ii=1;$ii<=$ii_max;$ii++){ if($a_size[$i][$ii]["amount"]>0){ print "<option value='{$a_size[$i][$ii]["size"]}'>{$a_size[$i][$ii]["size"]}</option>\n"; } } } print "</select>\n"; ?>

sato777
質問者

お礼

正常に動作させる事ができました。 指導、本当に有難うございました。

関連するQ&A

  • HTMLのSelectBOXがonchangeした場合の処理方法について

    下記のコードで、 "サイズ"選択するとそのサイズの在庫数に応じて セレクトBOXの"数量"の値を再表示させたいのですが、 やはりPHPだけでは不可能でしょうか?(クライアントは選択するのみでボタンなどは押さずに) また、JavaScriptのonchange()を使用して行う場合も PHPとの連携が良く分かりません。 具体例を元にご教授頂けると幸いです。 <?php if($article_size[$i]){ print"<br /> 【サイズ】 <select name='a_size' style='height:8; ' > <option value=''>選択</option>"; for($ii=1;$ii<=$ii_max;$ii++){ if($article_info[$i][$ii]["amount"]>0){ print " <option value='".$article_size[$i][$ii]."'>".$article_size[$i][$ii]." </option>"; }else { print " <option value='".$article_size[$i][$ii]."品切れ'>".$article_size[$i][$ii]."品切れ</option>"; }//END OF IF }//END OF FOR print" </select>"; } else { print" <br />"; }//END OF IF ELSE ?> 【数量】 <select name='a_amount' style="height:8; "> <?php if($article_info[3][0]["amount"]<=0){ print" <option value='0'>品切れ</option>"; }else if($article_info[3][0]["amount"]>0){ for($iii=1;$iii<=$article_info[3][0]["amount"];$ii++){ print" <option value='".$iii."'>".$iii."</option>"; } } ?> </select>

    • 締切済み
    • PHP
  • phpの値の受け渡し方法について

    b.phpの <dl> <form action='a.php' method='post'> <dt>生年月日</dt> <dd> <select name="Y"> <?php $start = 1920; //始まりの年 $end = 2020; //終わりの年 $select = 2000; //最初に選択された状態で表示したい年 for ($i=$start;$i<=$end;$i++){ if($i==$select){ echo "<option value=\"$i\" selected=\"selected\">$i</option>\n"; }else{ echo "<option value=\"$i\">$i</option>\n"; } } ?> </select> 年 <select name="M"> <?php for ($i=1;$i<=12;$i++){ echo "<option value=\"$i\">$i</option>\n"; } ?> </select> 月 <select name="D"> <?php for ($i=1;$i<=31;$i++){ echo "<option value=\"$i\">$i</option>\n"; } ?> </select> 日 </dd> </dl> <input type="submit" value="送信する" /> </form> というコードで取得した生年月日をa.phpに渡し、表示させます。 a.phpファイルで <?php print('誕生日は:' . ($_REQUEST['Y']. '年',ENT_QUOTES)); print(($_REQUEST['M']. '月',ENT_QUOTES)); print(($_REQUEST['D']. '日',ENT_QUOTES)); ?> と、コードを入力しましたら、 誕生日は:1985年1月31日 という値を受け取り、ブラウザ上で表示することはできたのですが、他のコードで表示する方法はないのかと考えております。 もし、他のコードで表示できる方法がありましたらぜひ教えてください。お願いします。

    • ベストアンサー
    • PHP
  • 日付のセレクトボックスで0付きの日付にしたい

    ネットで探した式を張り付ける位しかできない超初心者です。 以下のような当日表示の日付のセレクトボックス を探してペーストしたのですが1や2を01、02と表示しません。 これをどうやって直せば01,02,03,04,05と0付きの表示のセレクトボックスに 直せるでしょうか? どうぞよろしくお願いいたします。 <? $time = time(); $year = date("Y", $time); $month = date("n", $time); $day = date("j", $time); print("<select name=\"ayear\">"); //年は修正してください for( $i = 2010; $i <= 2020; $i++ ){ if( $i == $year ){ print("<option value=\"$i\" selected>$i</option>"); }else{ print("<option value=\"$i\">$i</option>"); } } print("</select>年"); print("<select name=\"amonth\">"); for( $j = 1; $j <= 12; $j++ ){ if( $j == $month ){ print("<option value=\"$j\" selected>$j</option>"); }else{ print("<option value=\"$j\">$j</option>"); } } print("</select>月"); print("<select name=\"aday\">"); for( $k = 1; $k <=31 ; $k++ ){ if( $k == $day ){ print("<option value=\"$k\" selected>$k</option>"); }else{ print("<option value=\"$k\">$k</option>"); } } print("</select>日"); ?>

    • ベストアンサー
    • PHP
  • コンボボックス生成の際の文字埋め

    print("<select name=\"emonth\">\r");  for( $i = 1; $i <=12; $i++ ){   if($i == $month ){    print("<option value=$i selectd>$i</option>\r");   }else{    print("<option value=$i>$i</option>\r");    }  } print("</select>"); 上記のようなソースの場合$iの頭を0で埋めて2桁にする場合どのような方法がありますでしょうか? LPAD関数を使ったのですがうまくいきませんでした。 例)print("<option value=lpad($i,2,'0')>$i</option>\r"); よろしくご教授願います。

    • ベストアンサー
    • PHP
  • 配列をオプションメニューに書き込むには?

    PHPを始めたばかりです。HTMLスクリプトの中に埋め込めるのがPHPの特徴だ、 と本に書かれていますが、次のようにオプションメニューリストを書こうとする時は、どうしたらよいのでしょうか。JavaScript との連携も考えないと不可能のように思えるのですが、いかがなのでしょうか?どなたか、どうかよろしく御教示下さい。 (辞書の見出し語配列 $wordlist は、この同じプログラムファイル内の別の場所で、PHPをつかって辞書ファイルを読んで取得されているものとします。グローバル変数です) <SELECT size="15" name="wordlist"> for ($i = 0; $i <= $max-1; $i++) //オプションメニューに記入する { for ($i=0; $i<=$#wordlist; $i++) { print "<option value=$wordlist[$i]>$wordlist[$i]></option>\n"; } } </SELECT>

    • ベストアンサー
    • PHP
  • プルダウン2つで別項目に値を代入したい.その2

    同じような質問ですみません。プルダウン2つで別項目に値を代入する方法のアドバイスを参考にこんなの作ったんですがうまくいかないです。どこがおかしいですか? <html> <script type="text/javascript"> function hoge(){ var v1=document.getElementById('s1').value; var v2=document.getElementById('s2').value; var rslt; if (v1==1 && v2==1) { rslt=36; } else { if (v1==1 && v2==2) { rslt=29; } else { if (v1==1 && v2==3) { rslt=22; } else { if (v1==1 && v2==4) { rslt=14; } else { if (v1==1 && v2==5) { rslt=7; } else { if (v1==1 && v2==6) { rslt=0; } else { rslt='?'; }} document.getElementById('txt').value=rslt; } </script> <body> <select id="s1" onChange="hoge()"> <option value="1">1 <option value="2">2 <option value="3">3 <option value="4">4 </select>   <select id="s2" onChange="hoge()"> <option value="1">1 <option value="2">2 <option value="3">3 <option value="4">4 <option value="5">5 <option value="6">6 </select><p> <input type="text" id="txt" value=""> </body> </html>

  • 値の取得

    先日と同じ問題を出してしまい、申し訳ございません。 iの値を取得したいですが、どうしてもservlet側を取得が出来ないです。 教えてください。 <%@page contentType="text/html; charset=Windows-31J"%> <%@ page import="java.util.*" %> <%@ page import="blog.*" %> <html> <body> <script type="text/javascript"> <!-- function check(){ if(window.confirm('本当に削除してよろしいでしょうか?')){ // 確認ダイアログを表示 var element = document.getElementById("i") request.setAttribute("id", element);// return true; // 「OK」時は送信を実行 } else{ // 「キャンセル」時の処理 window.alert('キャンセルされました'); // 警告ダイアログを表示 return false; // 送信を中止 } } //--> </script> <center> <table> <form action="SeachServlet" method="POST"> <tr> <td>名前:<input type="text" name="name" size="40" value="<%if(request.getAttribute("name")!=null){%> <%=request.getAttribute("name")%><%}%>"></td></tr> <tr><td>日付: <select name="year"> <option><%if(request.getAttribute("year")!=null){%> <%=request.getAttribute("year")%> <%}%></option> <%Calendar cl=Calendar.getInstance(); int year = cl.get(Calendar.YEAR); for(int i=year-7; i<=year+3;i++){ %> <option value="<%=i %>"> <%=i %></option> <%} %> </select>年 <select name="month"> <option><%if(request.getAttribute("month")!=null){%> <%=request.getAttribute("month")%> <%}%></option> <% for(int i=1; i<=12;i++){ if(i<10){%> <option value="0<%=i %>">0<%=i %></option> <%}else{%> <option value="<%=i %>"><%=i %></option> <%}}%> </select>月 <select name="day"> <option><%if(request.getAttribute("day")!=null){%> <%=request.getAttribute("day")%> <%}%></option> <% for(int i=1; i<=31;i++){ if(i<10){%> <option value="0<%=i %>">0<%=i %></option> <%}else{%> <option value="<%=i %>"><%=i %></option> <%}}%> </select>日</td> </tr> <tr><td><input type="button" value=" 印刷 "></td> <td><input type="submit" name="seach" value=" 検索 "></td> </form> </tr> </table> <hr> <FORM> <div><input type="button" value=" 戻る " onClick="history.back()"></div> </FORM> <form action="SeachServlet" method="POST"> <% List<Loginbeans> list = (List<Loginbeans>)request.getAttribute("productlist"); if(list.isEmpty()){ out.print("該当のデータはありません。"); }else{ %> <table border="1"> <tr><th>ユーザID</th><th>名前</th><th>日付</th></tr> <% int i=0; for (Loginbeans bn : list) { i++;//この値を取得したいです %> <tr><td><%=bn.getUser_id()%><input name="use_id" type="hidden" value="<%=bn.getUser_id() %>"/></td> <td><%=bn.getName()%><input name="name" type="hidden" value="<%=bn.getName()%>"/></td> <td><%=bn.getTotal()%><input name="total" type="hidden" value="<%=bn.getTotal()%>"/></td> <td><input id="<%=i%>" type="submit" value=" 削除 " name="delete" onClick="return check()"></td> </tr> <%}}%> <input type="hidden" name ="number" value ="element"> </form> </table> </center> </body> </html> selvet側で String id = (String)request.getAttribute("id"); String ida = request.getParameter("number"); 取得できないですが・・

  • プルダウンで選択された値を保持

    お世話になります。 PHPとMysqlでプログラムを作成しています。 プルダウンメニューを選択し、Submitボタンを押した後も選択された値を保持したままの状態にしたいのです。 以下のようなプログラムでdata2の場合だと保持ができますが、dataの場合は「すべて」に戻ってしまいます。 以上・未満を使用する場合の値の保持はどのようにすればよいのでしょうか? 宜しくお願い致します。 <select name='data'> <option value=' ' <?php if($data==" "){print " selected";} ?>>すべて <option value=' AND (data >= 1.8 AND data < 2.0) '<?php if($data>=1.8 AND $data < 2.0){print " selected";} ?>>1.8GHz以上 2.0GHz未満</option> <option value=' AND (data >= 2.00) '<?php if($data>=2.00){print " selected";} ?>>2.0GHz以上</option> <option value=' AND (data >= 2.80) '<?php if($data>=2.80){print " selected";} ?>>2.8GHz以上</option> </select> <select name='data2'> <option value='%' <?php if($data2=="%"){print " selected";} ?>>すべて <option value='1MB'<?php if($data2=="1MB"){print " selected";} ?>>1MB</option> <option value='2MB'<?php if($data2=="2MB"){print " selected";} ?>>2MB</option> </select> <input type="submit" value="絞り込む" name="submit1">

    • ベストアンサー
    • PHP
  • 生年月日・年月日のフォームが表示されない

    お世話になります。 下記のタグでは、表示されません。 サーバーの問題なのか、タグの問題かわかりませんので、 まず、タグを見て頂けませんか? よろしくお願いします。 ------------------------------------------------ <td width="30%">生年月日</td> <td width="70%"><script type="text/javascript"> document.write("<select name=\\"296643_year\\">"); for(i=1900;i<2010;i++){ if(i==1950){ document.write("<option value="+i+" selected>"+i+"</option>"); }else{ document.write("<option value="+i+">"+i+"</option>"); } }document.write("</select>"); document.write(" 年 "); document.write("<select name=\\"296643_month\\">"); for(i=1;i<13;i++){ if(i==1){ document.write("<option value="+i+" selected>"+i+"</option>"); }else{ document.write("<option value="+i+">"+i+"</option>"); }} document.write("</select>"); document.write(" 月 "); document.write("<select name=\\"296643_day\\">"); for(i=1;i<32;i++){ if(i==1){ document.write("<option value="+i+" selected>"+i+"</option>"); }else{ document.write("<option value="+i+">"+i+"</option>"); }}document.write("</select>"); document.write(" 日 "); </script> <br><font size="1"></font></td> </tr> <tr> ---------------------------------------------------------------- <td width="30%">電話の場合の日時</td> <td width="70%"> <script type="text/javascript"> document.write("<select name=\\"296652_year\\">"); for(i=2009;i<=2010;i++){ if(i==2009){ document.write("<option value="+i+" selected>"+i+"</option>"); }else{ document.write("<option value="+i+">"+i+"</option>"); } } document.write("</select>"); document.write(" 年 "); document.write("<select name=\\"296652_month\\">"); for(i=1;i<13;i++){ if(i==4){ document.write("<option value="+i+" selected>"+i+"</option>"); }else{ document.write("<option value="+i+">"+i+"</option>"); } } document.write("</select>"); document.write(" 月 "); document.write("<select name=\\"296652_day\\">"); for(i=1;i<32;i++){ if(i==23){ document.write("<option value="+i+" selected>"+i+"</option>"); }else{ document.write("<option value="+i+">"+i+"</option>"); }} document.write("</select>"); document.write(" 日 "); document.write("<select name=\\"296652_hour\\">"); for(i=0;i<24;i++){ if(i==0){ document.write("<option value="+i+" selected>"+i+"</option>"); }else{ document.write("<option value="+i+">"+i+"</option>"); } } document.write("</select>"); document.write(" 時 "); document.write("<select name=\\"296652_minute\\">"); for(i=0;i<60;i=i+5){ if(i==0){ document.write("<option value="+i+" selected>"+i+"</option>"); }else{ document.write("<option value="+i+">"+i+"</option>"); }} document.write("</select>"); document.write(" 分 "); </script><br><font size="1"></font></td> </tr> <tr>

    • ベストアンサー
    • HTML
  • セレクトボックスで選んだ配列を呼び込むプログラム。

    以下は、セレクトボックス1と2でそれぞれ松山市と高松市を選んだら、配列を呼び出すことができるプログラムです。 <script type="text/javascript"> function change() { if (document.getElementById("selbox")) { selboxValue = document.getElementById("selbox").value; if (selboxValue == "1") { //文字1を表示 document.getElementById("txt1").style.display = ""; //文字2を非表示 document.getElementById("txt2").style.display = "none"; } else if (selboxValue == "2") { //文字2を表示 document.getElementById("txt2").style.display = ""; //文字1を非表示 document.getElementById("txt1").style.display = "none"; } } } function kotae() { ten=0 if((f.q1.value == "松山市"&&f.q2.value == "高松市")||(f.q1.value == "高松市"&&f.q2.value == "松山市")) {f.q1.style.backgroundColor="aqua ";ten = ten + 50} else f.q1.style.backgroundColor="red" if(f.q3.value == "名古屋市"){f.q3.style.backgroundColor="aqua ";ten = ten + 25} else f.q3.style.backgroundColor="red" if(f.q4.value == "金沢市") {f.q4.style.backgroundColor="aqua ";ten = ten + 25} else f.q4.style.backgroundColor="red" f.tokuten.value=ten const keywords = ['あいうえお','かきくけこ', 'さしすせそ']; if (f.tokuten.value=50) { for (let i = 0; i < keywords.length; i++) { console.log(f.rank.value=keywords[0]); }} else if(f.tokuten.value >=20){f.rank.value = 'B'} else if(f.tokuten.value >=15){f.rank.value = 'C'} else if(f.tokuten.value <10){f.rank.value = 'D'} //ここまで } </script> <body> <form name="f"> 愛媛県の県庁所在地は <select name="q1"> <option>選択肢</option> <option>名古屋市</option> <option>松山市</option> <option>金沢市</option> <option>高松市</option> </select> です。 <p> 香川県の県庁所在地は <select name="q2"> <option>選択肢</option> <option>名古屋市</option> <option>松山市</option> <option>金沢市</option> <option>高松市</option> </select> です。<p> 愛知県の県庁所在地は <select name="q3"> <option>選択肢</option> <option>名古屋市</option> <option>松山市</option> <option>金沢市</option> <option>高松市</option> </select> です。<p> 石川県の県庁所在地は <select name="q4"> <option>選択肢</option> <option>名古屋市</option> <option>松山市</option> <option>金沢市</option> <option>高松市</option> </select> です。<p> <input type="button" name="b1" value="答え合わせ" onclick="kotae()"> <p> <input name=tokuten size="6">点 <!--HTMLここから--> <input name=rank class="hoge">ランク <!--HTMLここまで--> しかし、僕はもうちょっと踏み込んだところまで行きたいのです。 ブラウザに表示させたいのです。 document.writeで書くと別のページに遷移してしまうし、 一方でalertだと文章が読みづらいです。 ブラウザに配列を表示するものは以下のプログラムですが、 <script> var todo = ['メール確認', '日報送信', 'スケジュール確認', '資料作成']; for (var i = 0; i < todo.length; i++) {  var todoList = document.createElement('li');  todoList.textContent = todo[i];  document.getElementById('list').appendChild(todoList); } </script> ただ、これだとセレクトボックスで松山市と高松市を選んだ場合の表示ができません。どうしたらいいのでしょうか。 どうしたらいいのでしょうか。

専門家に質問してみよう