買い物かごのカテゴリ階層表示作成を下記のようにしたいのですが
例)
・カテゴリ1
・サブカテゴリ1
・サブサブカテゴリ1
・サブサブカテゴリ2
・サブカテゴリ2
・サブカテゴリ3
・カテゴリ2
while処理のメインカテゴリ生成内でwhile処理メインカテゴリサブカテゴリ生成内でwhile処理サブカテゴリ該当サブサブカテゴリ作成です。
現在、下記のような状態となっております。
・カテゴリ1
・サブカテゴリ1
・サブサブカテゴリ1
・サブサブカテゴリ2
・サブカテゴリ1
・サブカテゴリ2
・サブカテゴリ1
・サブカテゴリ2
・サブカテゴリ3
・カテゴリ2
該当サブカテゴリには3つ配列変数があります。
while処理でサブカテゴリ1内の該当サブサブカテゴリ1と2を
出力後、サブカテゴリ1がまた出力されます。サブカテゴリ1と2を
出力後、またサブカテゴリ1、2、3と出力します。
メインカテゴリは正常表示です。
1回のwhile処理に1個ずつ増やして出力しています。
出力する変数の場所を変えると、サブカテゴリは正常表示になり
今度はサブサブカテゴリが表示されなくなります。
サブカテゴリのwhile処理の計算方法がちがうのでしょうか?
ご教授お願いいたします。
No.1
- 回答日時:
ソースがないと分かりません。
ソースを補足してください。
この回答への補足
ソースです。
@ITEMCATE = split(/\*/, $ITEMCATE); #他のファイルから読込
@ITEMCATE2 = split(/\*/, $ITEMCATE2); #他のファイルから読込
@ITEMCATE3 = split(/\*/, $ITEMCATE3); #他のファイルから読込
sub form
{
$count = 0;
while($count < @ITEMCATE)
{
if("@ITEMCATE[$count]" ne "" and $in{'itemcate'} eq "@ITEMCATE[$count]")
{
$ITEMCATE_SEARCH = "$ITEMCATE_SEARCH<OPTION selected>@ITEMCATE[$count]";
if($in{'mod'} eq '' or $in{'mod'} eq 'kyefind')
{
$ITEMCATE_SELECT = "$ITEMCATE_SELECT<BR><FONT size=-1><B><<</FONT> <A href=\"./goods.cgi?itemcate=@ITEMCATE[$count]&reverse=$in{'reverse'}\"><FONT size=-1>@ITEMCATE[$count]</B></FONT></A><BR>\ \ <FONT size=-1>・</FONT><A href=\"./goods.cgi?itemcate=@ITEMCATE[$count]&mod=newfind&reverse=$in{'reverse'}\"><FONT size=-1>新着</FONT></A>";
}
else
{
$ITEMCATE_SELECT = "$ITEMCATE_SELECT<BR><FONT size=-1>・</FONT> <A href=\"./goods.cgi?itemcate=@ITEMCATE[$count]&reverse=$in{'reverse'}\"><FONT size=-1>@ITEMCATE[$count]</FONT></A><BR>\ \ <A href=\"./goods.cgi?itemcate=@ITEMCATE[$count]&mod=newfind&reverse=$in{'reverse'}\"><FONT size=-1><B><<新着</B></FONT></A>";
}
$ITEMOPTION2 = "";
@ITEMCATE2 = split(/\%/, @ITEMCATE2[$count]);
if(@ITEMCATE2[0] ne "")
{
$count2 = 0;
while($count2 < @ITEMCATE2)
{
if(@ITEMCATE2[$count2] ne "" and $in{'itemcate2'} eq @ITEMCATE2[$count2])
{
$ITEMOPTION2 = "$ITEMOPTION2<BR>\ \ <A href=\"./goods.cgi?itemcate=@ITEMCATE[$count]&itemcate2=@ITEMCATE2[$count2]&reverse=$in{'reverse'}\"><FONT size=-1><B><<@ITEMCATE2[$count2]</B></FONT></A>";
}
elsif(@ITEMCATE2[$count2] ne "" and $in{'itemcate2'} ne @ITEMCATE2[$count2])
{
$ITEMOPTION2 = "$ITEMOPTION2<BR>\ \ <A href=\"./goods.cgi?itemcate=@ITEMCATE[$count]&itemcate2=@ITEMCATE2[$count2]&reverse=$in{'reverse'}\"><FONT size=-1>・@ITEMCATE2[$count2]</FONT></A>";
}
$ITEMOPTION3 = "";
@ITEMCATE3 = split(/\%/, @ITEMCATE3[$count]);
if(@ITEM3[0] ne "")
{
$count3= 0;
while($count3 < @ITEMCATE3)
{
if(@ITEMCATE3[$count2] ne "" and $in{'itemcate3'} eq @ITEMCATE3[$count3])
{
$ITEMOPTION3 = "$ITEMOPTION3<BR>\ \ \ <A href=\"./goods.cgi?itemcate=@ITEMCATE[$count]&itemcate2=@ITEMCATE2[$count2]&itemcate3=@ITEMCATE3[$count3]&reverse=$in{'reverse'}\"><FONT size=-1><B><<@ITEMCATE3[$count3]</B></FONT></A>";
}
elsif(@ITEMCATE3[$count2] ne "" and $in{'itemcate3'} ne @ITEMCATE3[$count3])
{
$ITEMOPTION3 = "$ITEMOPTION3<BR>\ \ \ <A href=\"./goods.cgi?itemcate=@ITEMCATE[$count]&itemcate2=@ITEMCATE2[$count2]&itemcate3=@ITEMCATE3[$count3]&reverse=$in{'reverse'}\"><FONT size=-1>・@ITEMCATE3[$count3]</FONT></A>";
}
$count3++;
}
$ITEMCATE_SELECT = "$ITEMCATE_SELECT$ITEMOPTION2$ITEMOPTION3";
}
$count2++;
}
}
}
if("@ITEMCATE[$count]" ne "" and $in{'itemcate'} ne "@ITEMCATE[$count]")
{
$ITEMCATE_SEARCH = "$ITEMCATE_SEARCH<OPTION>@ITEMCATE[$count]";
$ITEMCATE_SELECT = "$ITEMCATE_SELECT<BR><FONT size=-1>・</FONT> <A href=\"./goods.cgi?itemcate=@ITEMCATE[$count]&reverse=$in{'reverse'}\"><FONT size=-1>@ITEMCATE[$count]</FONT></A>";
}
$count++;
}
}
何卒、よろしくお願いいたします。
No.2
- 回答日時:
まず、どの様な配列を用意されているかと
表示処理をどの様に書かれているかという事を
示していただけないと、回答のしようがないと思います。
まぁ、一番思い当たるのは
それぞれのwhile内で同一の変数を使っているんじゃないかな
という事ですかね。
それも結果を見ただけでは判断しかねるわけですが・・・
No.4
- 回答日時:
#1です、ソース拝見しました。
今回補足して頂いた中で、気になる点は・・・
>@ITEMCATE2 = split(/\%/, @ITEMCATE2[$count]);
この部分で、最初に入っていた@ITEMCATE2の内容が無くなりますが、大丈夫ですか?
>@ITEMCATE3 = split(/\%/, @ITEMCATE3[$count]);
同様に、最初に入っていた@ITEMCATE3の内容が無くなります。
>if(@ITEM3[0] ne "")
@ITEM3[0] この変数はここでしか使われていません。
サブサブカテゴリの処理がかなり怪しい気がします。(^^;
部分的なソースなので、ハッキリとした事は分かりませんでした。
下記を補足頂ければ、もう少し詳しい回答が書けると思います。
>@ITEMCATE = split(/\*/, $ITEMCATE); #他のファイルから読込
>@ITEMCATE2 = split(/\*/, $ITEMCATE2); #他のファイルから読込
>@ITEMCATE3 = split(/\*/, $ITEMCATE3); #他のファイルから読込
の具体的な内容。
sub form を呼び出している部分のソース。
HTMLを出力している部分のソース。
この回答への補足
ご回答いただきありがとうございます。
>if(@ITEM3[0] ne "")
@ITEMCATE3[0]の間違いです。すみません。
>@ITEMCATE = split(/\*/, $ITEMCATE); #他のファイルから読込
>@ITEMCATE2 = split(/\*/, $ITEMCATE2); #他のファイルから読込
>@ITEMCATE3 = split(/\*/, $ITEMCATE3); #他のファイルから読込
上記は別のカテゴリ登録cgiスクリプトで登録し読み込んでいます。
登録後、txtファイルに下記のように記載さます。
例)
$ITEMCATE = 'カテゴリ1*カテゴリ2';
$ITEMCATE2 = 'サブカテゴリ1%サブカテゴリ2*サブカテゴリ3';
$ITEMCATE3 = 'サブサブカテゴリ1%サブサブカテゴリ2*サブサブカテゴリ3*サブサブカテゴリ4';
*は階層を下にさげます。%は同階層内で表示です。
sub form内の各カテゴリwhail処理に入る前に
splitで配列しています。同階層内で表示する為に%でくぎっています。
>@ITEMCATE2 = split(/\%/, @ITEMCATE2[$count]);
上記例を出力した結果を下記のようにできればと思っています。
・カテゴリ1
・サブカテゴリ1
・サブサブカテゴリ1
・サブサブカテゴリ2
・サブカテゴリ2
・サブサブカテゴリ3
・カテゴリ2
・サブカテゴリ3
・サブサブカテゴリ4
HTMLを出力している部分は下記です。
$ITEMCATE_SELECT
上記記載でカテゴリ階層が表示されるようになっています。
HTMLを出力後の最初の表示はカテゴリ1と2が表示されるだけなっています。カテゴリ1をクリックするとカテゴリ1に該当する下位サブカテゴリとサブサブカテゴリが表示されます。
カテゴリ2の部分をクリックするとカテゴリ1部分だけの表示になり
カテゴリ2に該当する下位カテゴリが表示されるようになります。
サブサブカテゴリwhail処理後のスクリプトですが
$ITEMCATE_SELECT = "$ITEMCATE_SELECT$ITEMOPTION2$ITEMOPTION3"; #$ITEMCATE_SELECTに各カテゴリ表示内容を代入
$count2++; # サブカテゴリwhile処理に1追加
}
}
}
# 下記はクリックした該当カテゴリ以外を表示します。$ITEMCATE_SEARCHは検索用です。
if("@ITEMCATE[$count]" ne "" and $in{'itemcate'} ne "@ITEMCATE[$count]")
{
$ITEMCATE_SEARCH = "$ITEMCATE_SEARCH<OPTION>@ITEMCATE[$count]";
$ITEMCATE_SELECT = "$ITEMCATE_SELECT<BR><FONT size=-1>・</FONT> <A href=\"./goods.cgi?itemcate=@ITEMCATE[$count]&reverse=$in{'reverse'}\"><FONT size=-1>@ITEMCATE[$count]</FONT></A>";
}
$count++; # カテゴリwhail処理に1追加
}
}
この後、HTML出力になります。
$ITEMCATE_SELECT
上記変数名でカテゴリ一覧が表示され該当カテゴリをクリックすると
下位カテゴリが表示されます。
大変、恐縮ですが、ご教授お願いいたします。
No.5
- 回答日時:
#1、4です。
追加補足ありがとうございます。問題点をいくつか発見しました。>$ITEMOPTION2 = "";
この初期化がループの外にありましたが、中に入れる必要があります。
サブカテゴリが必要以上に繰り返されたのはこの為です。
>@ITEMCATE3 = split(/\%/, @ITEMCATE3[$count]);
ここですが、$countではダメですね。サブカテゴリが先頭から幾つ目に当たるのか計算して入れる必要があります。
また、@ITEMCATE3 の内容が書き換えられてしまうので、2回目以降のループでおかしくなります。
以下、発見した問題を修正したソースです、これで試してみてください。
sub form
{
#サブカテゴリが先頭から幾つ目に当たるのか計算するための前処理
@temp = split(/\*/, $ITEMCATE2);
$count2_offset[0] = 0;
for($i = 0;$i < @temp; $i++){
@temp2 = split(/\%/, $temp[$i]);
$count2_offset[$i+1] = @temp2;
}
$count = 0;
while($count < @ITEMCATE)
{
if("$ITEMCATE[$count]" ne "" and $in{'itemcate'} eq "$ITEMCATE[$count]")
{
$ITEMCATE_SEARCH = "$ITEMCATE_SEARCH<OPTION selected>$ITEMCATE[$count]";
if($in{'mod'} eq '' or $in{'mod'} eq 'kyefind')
{
$ITEMCATE_SELECT = "$ITEMCATE_SELECT<BR><FONT size=-1><B><<</FONT> <A href=\"./goods.cgi?itemcate=$ITEMCATE[$count]&reverse=$in{'reverse'}\"><FONT size=-1>$ITEMCATE[$count]</B></FONT></A><BR>\ \ <FONT size=-1>・</FONT><A href=\"./goods.cgi?itemcate=$ITEMCATE[$count]&mod=newfind&reverse=$in{'reverse'}\"><FONT size=-1>新着</FONT></A>";
}
else
{
$ITEMCATE_SELECT = "$ITEMCATE_SELECT<BR><FONT size=-1>・</FONT> <A href=\"./goods.cgi?itemcate=$ITEMCATE[$count]&reverse=$in{'reverse'}\"><FONT size=-1>$ITEMCATE[$count]</FONT></A><BR>\ \ <A href=\"./goods.cgi?itemcate=$ITEMCATE[$count]&mod=newfind&reverse=$in{'reverse'}\"><FONT size=-1><B><<新着</B></FONT></A>";
}
@ITEMCATE2 = split(/\%/, $ITEMCATE2[$count]);
if($ITEMCATE2[0] ne "")
{
$count2 = 0;
while($count2 < @ITEMCATE2)
{
$ITEMOPTION2 = ""; #ここで初期化が必要
if($ITEMCATE2[$count2] ne "" and $in{'itemcate2'} eq $ITEMCATE2[$count2])
{
$ITEMOPTION2 = "$ITEMOPTION2<BR>\ \ <A href=\"./goods.cgi?itemcate=$ITEMCATE[$count]&itemcate2=$ITEMCATE2[$count2]&reverse=$in{'reverse'}\"><FONT size=-1><B><<$ITEMCATE2[$count2]</B></FONT></A>";
}
elsif($ITEMCATE2[$count2] ne "" and $in{'itemcate2'} ne $ITEMCATE2[$count2])
{
$ITEMOPTION2 = "$ITEMOPTION2<BR>\ \ <A href=\"./goods.cgi?itemcate=$ITEMCATE[$count]&itemcate2=$ITEMCATE2[$count2]&reverse=$in{'reverse'}\"><FONT size=-1>・$ITEMCATE2[$count2]</FONT></A>";
}
$ITEMOPTION3 = "";
@ITEMCATE3 = split(/\*/, $ITEMCATE3); #初期化が必要
@ITEMCATE3 = split(/\%/, $ITEMCATE3[$count2_offset[$count]+$count2]); #$countではダメ
if($ITEMCATE3[0] ne "")
{
$count3= 0;
while($count3 < @ITEMCATE3)
{
if($ITEMCATE3[$count3] ne "" and $in{'itemcate3'} eq $ITEMCATE3[$count3])
{
$ITEMOPTION3 = "$ITEMOPTION3<BR>\ \ \ <A href=\"./goods.cgi?itemcate=$ITEMCATE[$count]&itemcate2=$ITEMCATE2[$count2]&itemcate3=$ITEMCATE3[$count3]&reverse=$in{'reverse'}\"><FONT size=-1><B><<$ITEMCATE3[$count3]</B></FONT></A>";
}
elsif($ITEMCATE3[$count3] ne "" and $in{'itemcate3'} ne $ITEMCATE3[$count3])
{
$ITEMOPTION3 = "$ITEMOPTION3<BR>\ \ \ <A href=\"./goods.cgi?itemcate=$ITEMCATE[$count]&itemcate2=$ITEMCATE2[$count2]&itemcate3=$ITEMCATE3[$count3]&reverse=$in{'reverse'}\"><FONT size=-1>・$ITEMCATE3[$count3]</FONT></A>";
}
$count3++;
}
$ITEMCATE_SELECT = "$ITEMCATE_SELECT$ITEMOPTION2$ITEMOPTION3";
}
$count2++;
}
}
}
if("$ITEMCATE[$count]" ne "" and $in{'itemcate'} ne "$ITEMCATE[$count]")
{
$ITEMCATE_SEARCH = "$ITEMCATE_SEARCH<OPTION>$ITEMCATE[$count]";
$ITEMCATE_SELECT = "$ITEMCATE_SELECT<BR><FONT size=-1>・</FONT> <A href=\"./goods.cgi?itemcate=$ITEMCATE[$count]&reverse=$in{'reverse'}\"><FONT size=-1>$ITEMCATE[$count]</FONT></A>";
}
$count++;
}
}
ご回答ありがとうございます。
実行結果ですが下記のようになりました。
・カテゴリ1
・サブカテゴリ1
・3
・カテゴリ2
サブサブカテゴリが3の要素の数が表示されました。
3以降の表示はカテゴリ2の表示になりました。
>$ITEMOPTION2 = "";
上記をループ内に入れるとサブカテゴリの表示の繰り返しは
消えましたが、今度はサブサブカテゴリが繰り替えされ
カテゴリ2以降のサブカテゴリの最後が表示されなくなりました。
$ITEMOPTION2 = "";だけをループ内に入れた実行結果例)
・カテゴリ1
・サブカテゴリ1
・サブサブカテゴリ1
・サブサブカテゴリ2
・サブカテゴリ2
・サブサブカテゴリ1 #ここには該当するサブサブカテゴリを登録していませんが、サブサブカテゴリ1が表示されます。
・サブカテゴリ3
・サブサブカテゴリ1 #同様
・カテゴリ2
・サブカテゴリ4
・サブサブカテゴリ3
・サブサブカテゴリ4
・サブカテゴリ5
・サブサブカテゴリ4 #ここでは該当するサブサブカテゴリを登録していませんが、今度はサブサブカテゴリ4(2番目)が表示されます。
・サブカテゴリ6 #ここは登録していますが表示されませんでした。
大変恐れ入りますが、ご教授お願いいたします。
No.6
- 回答日時:
>$ITEMCATE = 'カテゴリ1*カテゴリ2';
>$ITEMCATE2 = 'サブカテゴリ1%サブカテゴリ2*サブカテゴリ3';
>$ITEMCATE3 = 'サブサブカテゴリ1%サブサブカテゴリ2*サブサブカテゴリ3*サブサブカテゴリ4';
このデータで検証した時には、おっしゃられている不具合は出ませんでした。$ITEMCATE3の内容の私の解釈が間違っているのかもしれません。サブサブカテゴリの内容が無い場合の事を考慮していませんでした。
不具合の結果のみ書かれても検証できませんので、その時の入力データを補足してください。
$ITEMCATE;
$ITEMCATE2;
$ITEMCATE3;
この回答への補足
ご回答ありがとうございます。ご連絡が遅くなり大変申し訳ありません。
不具合の結果時点のデータ入力になります。
$ITEMCATE = 'カテゴリ1*カテゴリ2';
$ITEMCATE2 = 'サブカテゴリ1%サブカテゴリ2%サブカテゴリ3*サブカテゴリ4%サブカテゴリ5%サブカテゴリ6';
$ITEMCATE3 = 'サブサブカテゴリ1%サブサブカテゴリ2*サブサブカテゴリ3%サブサブカテゴリ4';
上記で実行した場合下記のように表示したいのですが
・カテゴリ1
・サブカテゴリ1
・サブサブカテゴリ1
・サブサブカテゴリ2
・サブカテゴリ2
・サブサブカテゴリ3
・サブサブカテゴリ4
・サブカテゴリ3
・カテゴリ2
・サブカテゴリ4
・サブカテゴリ5
・サブカテゴリ6
現在のところ、サブサブカテゴリを*で区切ると
次のサブカテゴリ2の下ではなくカテゴリ2該当のサブサブカテゴリ4に
表示されます。
また下記のように登録した場合
$ITEMCATE = 'カテゴリ1*カテゴリ2*カテゴリ3*カテゴリ4';
$ITEMCATE2 = 'サブカテゴリ1%サブカテゴリ2%サブカテゴリ3*サブカテゴリ4%サブカテゴリ5%サブカテゴリ6**';
$ITEMCATE3 = 'サブサブカテゴリ1%サブサブカテゴリ2*サブサブカテゴリ3%サブサブカテゴリ4';
サブカテゴリの該当はカテゴリ1と2までしかないのでサブカテゴリ6の
後には*が入ります。
また、サブカテゴリを下記のように登録した場合(サブカテゴリ3の後に**)
$ITEMCATE2 = 'サブカテゴリ1%サブカテゴリ2%サブカテゴリ3**サブカテゴリ4%サブカテゴリ5%サブカテゴリ6';
カテゴリ2には該当サブカテゴリ登録なしになり
サブカテゴリ4、5、6はカテゴリ3の該当になります。
ここまでは正常なのですが、
サブサブカテゴリを下記のようにすると
$ITEMCATE3 = 'サブサブカテゴリ1*サブサブカテゴリ2*サブサブカテゴリ3%サブサブカテゴリ4';
サブサブカテゴリ2の該当がサブカテゴリ2ではなくカテゴリ2該当の
サブカテゴリに下に表示されます。またサブカテゴリの数が
サブサブカテゴリよりも多いときはサブサブカテゴリ登録データ内に
自動で*が表示されません。
いろいろ試したのですが
サブサブカテゴリwhlie処理内の比較演算子で[$count3]を[$count2]に
変更したら
if($ITEMCATE3[$count2] ne "" and $in{'itemcate3'} eq $ITEMCATE3[$count3])
elsif($ITEMCATE3[$count2] ne "" and $in{'itemcate3'} ne $ITEMCATE3[$count3])
表示結果は下記のようになりました。
・カテゴリ1
・サブカテゴリ1
・サブサブカテゴリ1
・サブサブカテゴリ2
・サブカテゴリ2
・サブカテゴリ3
サブカテゴリ2の下に繰り返し表示されていたサブサブカテゴリ1が
なくなりました。
しかし、サブカテゴリ2該当されるサブサブカテゴリ3と4は
カテゴリ2のサブカテゴリ4の下に表示されサブカテゴリ6は
登録しているのに表示されません。
何卒、ご教授お願いいたします。
ご回答いただきありがとうございます。
サブサブカテゴリ登録時の*の自動表示は別のカテゴリ登録スクリプトの
問題ですので、今回の処理と別件です。すみません。後で見直してみます。
サブサブカテゴリに登録し、保存されているtxtファイルの
$ITEMCATE3 =;に直接*を入力した場合に#6の補足内容になります。
何卒、宜しくお願いいたします。
No.7
- 回答日時:
#2です。
軽く巻き戻ります。
こんな感じにすればシンプルに書けると思いますが・・・
空のカテゴリの場合、"サブカテゴリ2**サブカテゴリ3"という様に
空であるという事が判れば、空判定で
対応可能だと思います。
---------------------------------------------------------
$ITEMCATE = 'カテゴリ1*カテゴリ2';
$ITEMCATE2 = 'サブカテゴリ1%サブカテゴリ2*サブカテゴリ3';
$ITEMCATE3 = 'サブサブカテゴリ1%サブサブカテゴリ2*サブサブカテゴリ3*サブサブカテゴリ4';
@ITEMCATE = split(/\*/,$ITEMCATE);
@ITEMCATE2 = split(/\*/,$ITEMCATE2);
@ITEMCATE3 = split(/\*/,$ITEMCATE3);
for $cate_a (@ITEMCATE){
@cate = split(/\%/,$cate_a);
for $cate_b ( @cate ){
if( $cate_b eq "" ){ next; }
print $cate_b . "\n";
$cate2_a = shift(@ITEMCATE2);
@cate2 = split(/\%/,$cate2_a);
for $cate2_b ( @cate2 ){
if( $cate2_b eq "" ){ next; }
print " " . $cate2_b . "\n";
$cate3_a = shift(@ITEMCATE3);
@cate3 = split(/\%/, $cate3_a);
for $cate3_b (@cate3){
if( $cate3_b eq "" ){ next; }
print " " . $cate3_b . "\n";
}
}
}
}
-----------------------------------------------------------
思いっきり巻き戻ります。
元々、カテゴリ、サブカテゴリ、サブサブカテゴリに
親子関係を持っていないので、表示する際に複雑になっています。
簡単な方法としては、表示階層をそのままデータとして持たせる方法とか
親子関係でデータを持たせて表示の時に上手く表示させる方法などがあります。
表示をそのまま持たせる方法
--------------------------
$ITEMCATE[0]="カテゴリ1,,";
$ITEMCATE[1]=",サブカテゴリ1,";
$ITEMCATE[2]=",,サブサブカテゴリ1";
$ITEMCATE[3]=",,サブサブカテゴリ2";
$ITEMCATE[4]=",サブカテゴリ2,";
$ITEMCATE[5]=",,サブサブカテゴリ3";
$ITEMCATE[6]="カテゴリ2,,";
$ITEMCATE[7]=",サブカテゴリ3,";
$ITEMCATE[8]=",,サブサブカテゴリ4";
カンマ区切りで表示のまま配列に保存
表示はそのままループで回して、空の所をインデントにする
--------------------------
親子関係を持たせてる方法(表示方法)
--------------------------
$ITEMCATE[0] = "カテゴリ1,サブカテゴリ1,サブサブカテゴリ1";
$ITEMCATE[1] = "カテゴリ1,サブカテゴリ1,サブサブカテゴリ2";
$ITEMCATE[2] = "カテゴリ1,サブカテゴリ2,サブサブカテゴリ3";
$ITEMCATE[3] = "カテゴリ2,サブカテゴリ3,サブサブカテゴリ4";
%CATE_MASTER;
#親子関係を連想配列に入れる(キーとして)
for $cate (@ITEMCATE) {
($cate1, $cate2, $cate3) = split(/,/, $cate);
$CATE_MASTER{$cate1}{$cate2}{$cate3} = 1;
}
foreach $cate1 ( keys(%CATE_MASTER) ){
print $cate1 . "\n";
foreach $cate2 ( keys(%{$CATE_MASTER{$cate1}}) ){
print " " . $cate2 . "\n";
foreach $cate3 ( keys(%{$CATE_MASTER{$cate1}{$cate2}}) ){
print " " . $cate3 . "\n";
}
}
}
--------------------------
No.8ベストアンサー
- 回答日時:
補足ありがとうございます。
#5のソースを2箇所修正します。1つ目は、私が追加した部分なんですが、計算式が間違っていました。失礼しました。
2つ目は、$ITEMOPTION2 と $ITEMOPTION3 を $ITEMCATE_SELECT に追加する部分ですが、IF文の中に有り、サブサブカテゴリが無い場合に通過しません。この時追加すべき $ITEMOPTION2 が追加されません。この代入をIF文の外に出す必要があります。
#5のソースの8行目
>$count2_offset[$i+1] = @temp2;
$count2_offset[$i+1] = $count2_offset[$i] + @temp2;
#5のソースの58行目~61行目
>$ITEMCATE_SELECT = "$ITEMCATE_SELECT$ITEMOPTION2$ITEMOPTION3";
>}
>
>$count2++;
}
$ITEMCATE_SELECT = "$ITEMCATE_SELECT$ITEMOPTION2$ITEMOPTION3";
$count2++;
以上です。
補足していただいた入力データで簡単にチェックしましたが、正常に動いていると思います。ご確認ください。
venzou 様
ご多忙の中、ご回答いただきありがとうございます。
正常に動いております。
感謝の気持ちでいっぱいです。
心より感謝申し上げます。
venzou様のように、短時間でスクリプトを作成、修正、改造できる
ように励みたいと思います。
お礼の投稿で質問をするのは大変恐縮ですが
venzou様はperlやその他のプログラムをどのようにして
学ばれたのでしょうか。是非、知りたいです。
私は独学で書籍や他のスクリプトを改造しながらですが
まだまだです。基礎的な事柄を再徹底して学んでいきたいと
思っております。
何卒、宜しくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストファイルで提出とは?
-
perlをバージョンアップしたら...
-
openした後、closeしないでプロ...
-
Strawberry Perl for Windows ...
-
Perlの全角スペース 文字化け?
-
Perlで、「が」を、「...
-
Perlでの文字列置換
-
Perlでテキストファイルの一部...
-
サクラエディターの設定の仕方...
-
検索ボックスから製品名を検索...
-
マイコンを使った時のセンサー...
-
Perl 特定のフォルダ以外削除
-
Perl 仮登録、本登録システムに...
-
Perl 正規表現
-
Perl テキスト 重複 個数
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ディレクトリのファイル数取得
-
パールの-pオプションの値0777...
-
Python3の関数化
-
自作のアクセスカウンタ
-
CGIでhtmlを作成するもブラウザ...
-
ラジオボタンが両方とも選択で...
-
「value」に2つの値をセットす...
-
wordの数式について 定積分を書...
-
WEBページを強制的に横画面で見...
-
select値をhiddenのvalueに渡し...
-
別formのhidden項目を自form値...
-
チェックボックスの返す値
-
INPUT TYPE
-
VB初心者。小数点以下の表示で...
-
[HTML]プルダウンメニューの横...
-
FORMのselectの選択肢を最初か...
-
VB.net データーグリッドビュー...
-
MSPゴシックで、一番幅を取る文字
-
Error: No Recipient というエ...
-
ラジオボタンを選択済みにする...
おすすめ情報