• ベストアンサー

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

以下のソースでブラウザ出力すると、セレクトボックスの 選択項目が、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>

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

  • ベストアンサー
回答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