WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:返信記事の表示の仕方について。

くろだい[MAIL][URL][WriteDate : Wed Nov 8 01:42:46 2000]

はじめまして。
今自作の掲示板を制作中で返信記事を表示させたいのですが、どのようにして判断すればいいのか
わからず、うまく表示することが出来ません。

理想としましては

No.1 タイトル てすと1
  〜ここに文章〜

 Res:てすと1
   〜ここに返信記事の文章〜

と言う風になるようにしたいのです。

今使用しているdatファイルは
記事番号,親記事番号,名前,〜中略〜,メッセージ


3,3,ひかり,〜中略〜,新規文章です。
2,1,ゆう,〜中略〜,てすと1への返信です。
1,1,くろだい,〜中略〜,てすと1です。

と言う風に入っていると過程します。
書き込まれると後ろにどんどんデータは書き込まれていきます。
今僕が考えることができる限りでは
表示するときに親記事と子記事を違う配列に入れて表示する
というやり方しか思いつかず、これだと繰り返しに向きません。

どなたかよい表示方法をお教え下さい。

Qz[MAIL][URL][WriteDate :Wed Nov 8 05:17:39 2000]

使用する言語がPerlであるという前提で書きます。

まず@lineにファイルの内容を全部いれます。
(これは、わかりますよね)
あとは、sort関数でsortします。

@line2 = sort{
  ($a_no, $a_res) = split(/,/, $a, 2);
  ($b_no, $b_res) = split(/,/, $b, 2);
  ($b_res <=> $a_res) || ($a_no <=> $b_no);
} @line;

これで、@line2に、親記事(新しい順)->返信記事(古い順)という順番にデータが入ります。
あとは、この@line2を順次表示させればOKです。
ただ、このやりかたは、文字列の分解・比較としているため、あまり早くないらしいです。
以下のやりかたの方が早いらしいです。

foreach(@line){
  ($w_no, $w_res) = split(/,/, $_, 2);
  push(@no, $w_no);
  push(@res, $w_res);
}
@line2 = @line[sort{($res[$b] <=> $res[$a]) || ($no[$a] <=> $no[$b])}0.. $#line];

ベンチマークをとって調べてはいないので、実際は、どうなのかわかりません^^
参考のリソースを信じるならば、後者のほうが早いらしいということです。
あと、@line2は、@lineにしても大丈夫です。
sort関数や配列の操作に関しては、Perlのマニュアルを読んでください。

参考
http://www.din.or.jp/~ohzaki/perl.htm#SortMulti

#あくまでもPerlです。CとかRubyどかその他でのやりかたはちょっとわからないです。

Qz[MAIL][URL][WriteDate :Wed Nov 8 12:11:46 2000]


>split(/,/, $a, 2)
>split(/,/, $_, 2)
最後の2はいらないです^^

くろだい[MAIL][URL][WriteDate :Thu Nov 9 00:33:46 2000]

Qzさん返信どうもありがとうございます。
自分が何を使っているかなど明確に書き込んでいなくて申し訳なかったです。
Qzさんが教えてくれましたPerlのことについてです。

Perlメモを読んでやり方などは理解できましたが、疑問に思ったことがあります。
それは

>@line2 = sort{ 
>  ($a_no, $a_res) = split(/,/, $a); 
>  ($b_no, $b_res) = split(/,/, $b); 
>  ($b_res <=> $a_res) || ($a_no <=> $b_no); 
>} @line;

の場合のspritで区切る場合に対象となる変数の$aと$bに関してですが、
Perlメモの場合はmy関数を使って局所化して使っているみたいですが、
split関数で分解する場合$_にデータが入りますよね。今までは全て$_を使ってやってきたので
$aや$bのように使った場合$aの方は1件目のデータの分解、$bの方には2件目のデータの分解
という風になるのでしょうか。

あと僕が今使っている項目は
($number,$number2,$name,〜,$msg) = split(/,/, $_);
という風になっています。もし

>  ($a_no, $a_res) = split(/,/, $a); 
をアレンジする場合は
($number,$number2,$name,〜,$msg) = split(/,/, $a);
という風に使ってよろしいのでしょうか。

よろしくお願いします。

 

Qz[MAIL][URL][WriteDate :Thu Nov 9 02:09:22 2000]


>$a,$b
僕が説明するよりは、こちらの説明をご覧になったほうがわかりやすいと思います。
http://www.tech-web.net/perlmania/perlfunc.zhtml#S

>($number,$number2,$name,〜,$msg) = split(/,/, $a); 
それでもOKですが、
($number,$number2) = split(/,/, $a); 
と後の変数を書かなくても大丈夫です。



くろだい[MAIL][URL][WriteDate :Fri Nov 10 02:21:24 2000]

Qzさん本当にありがとうございます。

毎回参考資料も教えていただき本当に助かりました。
2パターンとも試して両方とも成功しました。

これからもいろいろと質問すると思いますがよろしくお願いします。
回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]