dポイントプレゼントキャンペーン実施中!

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

A 回答 (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号"になります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/09 13:02

No.2です。

一部訂正。

>結果、$a_size[1]の最初の文字を1で上書きすることになっています。
$a_size[3][1]の…、でした。すみません。
    • good
    • 0

興味深かったので自分でもいろいろ試してみました。


まずは単純な以下のソースを実行してみてください。
<?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]などとして、変数を分ければいいのではないのでしょうか。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/09 13:02

$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";
?>
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/09 13:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!