CGIを改造して記事を更新日順でソートする方法

このQ&Aのポイント
  • CGIを改造して、記事を更新日順でソートする方法を教えてください。
  • 現在、某CGIを改造中で、記事を更新日順にソートしたいです。ソート部分の現状はプログラムコードで示されており、日付が分かれているため結合してソートしたいです。どのようにすれば実現できるでしょうか?
  • CGIの改造中で、記事を更新日順にソートしたいです。現在のソート部分のコードはプログラム内に記載されており、日付が分かれているため結合してソートしたいです。解決策を教えてください。
回答を見る
  • ベストアンサー

ソートの方法

某CGIを改造中です。 記事を更新日順でソートしなおしたいです。 多分、ソート部分だと思われる部分の現状は、 ----- foreach (@data) {   ($no,$year1,$month1,$day1,$name~~) = split(/<>/);   @tmp = ();   @tmp = map {(split /<>/)[0]} @data;   @data = @data[sort {$tmp[$b] cmp $tmp[$a]} 0 .. $#tmp]; } ----- です。 ただ、見ての通り、日付が「$year1,$month1,$day1」と分かれています。これを結合して(20060309のような形)、それを元にソートしなおしたいのですが、どのようにしたら良いでしょうか? 方法を教えてください。お願いします。

  • Perl
  • 回答数1
  • ありがとう数1

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

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

# foreachを使う理由が分からないスクリプトですね。。。 そのforeach部分をコメントアウトして、下記のスクリプトを追記してください。 @data = map {$_->[0]} sort {$b->[2] <=> $a->[2] or $b->[3] <=> $a->[3] or $b->[4] <=> $a->[4]} map {[$_, split /<>/]} @data; シュワルツ変換と呼ばれるもので、参考URLに分かりやすく解説があります。 これを覚えるとソートがものすごく楽になりますよ。 これは日付降順に並べ替えますが、昇順に並べ替えたい場合は$aと$bを全部入れ替えてください。

参考URL:
http://www.din.or.jp/~ohzaki/perl.htm#SortST
master-3rd
質問者

お礼

ありがとうございました。ばっちりできました!!

関連するQ&A

  • サイト内検索CGI 更新新しい順に表示したい(2)

    http://okwave.jp/qa/q9269398.html ↑以前に質問したページです。 解決しないまま4週間たちそうなので(2)のページを作りました。 以前の質問はこんな感じでした↓ ──────────────────────────────────────────────────── CGIのSite_Searchを使っているのですが、公式サイトが閉鎖してしまっています。 Site_Searchの検索結果画面はこんな感じです。 http://nihon5ch.net/contents/ch5/site_search.cgi?mode=and&key=%A4%E2%A4%CE&list=40 これを、Key Search(http://www.kent-web.com/data/ksearch.html)のように、 update(Key Searchでいうところの日付)の新しい順に表示し、 できれば「新しい順/古い順」にソートできるようにしたいのです。 site_search.cgiの中身はこんな感じです。 http://delcy.jp/site_search.cgi ──────────────────────────────────────────────────── こちらのサイトのおかげで、 1回目の検索で、検索結果を新しい順に表示し、 検索結果画面の検索窓のところに、プルダウン「(ページの更新日が)新しい順/古い順」を設置する、という所まではできるようになりました。 今困っているのは、 プルダウンで「古い順」を選んでも、検索結果が古い順にソートされない事です。 ちなみに、print "$in{'sort'}<br>";を組み込んで、「古い順」で検索してみると、 値は「0(=古い順)」が表示されます。 ↓今回やってみたこと ──────────────────────────────────────────────────── ●$sortFlag = $in{'sort'}だけforeach ($top..$end) {の直前に入れたら 「500 Internal Server Error」が出たので以下のようにしました。 ●if ($sortFlag == 0) { @ret = sort{(split(/<>/,$a))[3] cmp (split(/<>/,$b))[3]} @hits; } else { @ret = sort{(split(/<>/,$b))[3] cmp (split(/<>/,$a))[3]} @hits; } @hits = @ret; はforeach ($top..$end) {の直後に入れました ↓今回カスタマイズした部分 ---------------- $sortFlag = $in{'sort'}; if($sortFlag == "") { $sortFlag = 1; } if ($sortFlag == 0) { @ret = sort{(split(/<>/,$a))[3] cmp (split(/<>/,$b))[3]} @hits; } else { @ret = sort{(split(/<>/,$b))[3] cmp (split(/<>/,$a))[3]} @hits; } @hits = @ret; foreach ($top..$end) { ($hfile,$htitle,$hsize,$hupdate,$hinf) = split (/<>/,$hits[$_]); if ($sortFlag == 0) { @ret = sort{(split(/<>/,$a))[3] cmp (split(/<>/,$b))[3]} @hits; } else { @ret = sort{(split(/<>/,$b))[3] cmp (split(/<>/,$a))[3]} @hits; } @hits = @ret; ──────────────────────────────────────────────────── よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • ソートの方法

    こんばんわ。ソートの処理で行き詰ってしまいました… (@allには正規表現で一致したデータを全て読み込んであります。) foreach (@all){ ($filename,$title,$sentence,)= split(/,/,$_); $score = ..... #スコアを求める この後@allを$scoreの値が大きい順にソートし、@sorted_listを作成したいのですが、この後どの様なコードを書けば良いのでしょうか? 自分で言うのもなんですがあまり上手く説明できませんでした… わかりにくい説明ですがよろしくお願いします。

    • ベストアンサー
    • Perl
  • csv元データーの数字の列が、""で囲まれているせいか、数値としてのソートできません

    次の式でソートしたいのですが、 @LINES = sort { (split(/\,/,$a))[0] <=> (split(/\,/,$b))[0] } @LINES; csv元データーの数字の列が、 "28000000","鈴木", のように""で囲まれているせいか、<=>で数値としてのソートできません。 cmpで文字列としてのソートは出来ます。 どうしたら良いのでしょうか?

    • ベストアンサー
    • Perl
  • 配列のソートについて質問です。

    配列のソートについて質問です。 2つのキーで配列の中身をソートしたいのですが、スマートな書き方があれば教えてください。 そもそも間違っている、などのご指摘でもありがたいです。 @t1 = map {(split /,/)[1]} @data; @t2 = map {(split /,/)[2]} @data; @data = @data[sort {$t1[$a] <=> $t1[$b] or $t2[$a] <=> $t2[$b]} 0 .. $#t1]; @dataの内容 A,1,2 B,1,3 C,2,1 D,3,2 E,3,1 F,1,1 出力結果 F,1,1 A,1,2 B,1,3 C,2,1 E,3,1 D,3,2 よろしくお願いします。

    • ベストアンサー
    • Perl
  • ソート処理

    ついこの間正規表現のことで質問させていただいたものです なんとか問題は解決しました それとは別にソート関連での質問があります 正規表現の前にソートについて質問してご回答を頂いてからそれを参考に試してみました http://oshiete1.goo.ne.jp/kotaeru.php3?q=1882190 です push で@tmpの内容を ($score,$filename,$title,$sentenceの順番に) 3.5 abc.txt あいうえお aaaaa 4.6 def.txt かきくけこ bbbbb 2.8 ghi.txt さしすせそ ccccc 5.1 jkl.txt たちつてと ddddd という風にしました このリストを @tmp = map {$_->[0]} sort {$a->[0] <=> $b->[0]} map {[$_, split /<>/]}@tmp; としたんですが結果は abc.txt あいうえお aaaaa def.txt かきくけこ bbbbb ghi.txt さしすせそ ccccc jkl.txt たちつてと ddddd 3.5 4.6 2.8 5.1 というふうになってしまいます これを スコア順に 5.1 jkl.txt たちつてと ddddd 4.6 def.txt かきくけこ bbbbb 3.5 abc.txt あいうえお aaaaa 2.8 ghi.txt さしすせそ ccccc としたいのですがうえのソースでは何がいけないんでしょうか??

    • ベストアンサー
    • Perl
  • 文字列のソート

    Mysql5を使用しています。 nameというレコードがあったとして、内容が ・year2008 ・year2006 ・year2007 ・year2005 というデータが格納されているときに、 この文字列から判断して年代順にソートすることはできますでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 切り分けてソート(?)

    CGIを改造しようと努力中です。 イベント開催一覧のようなものを表示させたいので、更新記録CGIを改造しつつ自分の目的にあった表示にしたいと思っています。 この中で、日付ごとに表示をさせたいと思っています。 「$no,$titles,$comment,$img,$date」の形でログに保存していっています。 もちろん「$date」の項目に日付が入っているのですが、「2005/00/00~2005/00/00」または「2005/00/00~00/00」という「開始日と終了日」で保存されています。これを終了日でソートし、早く終わるものを一番上に持って来たいのです。 しかし、方法がさっぱりです。 概念的には… 1.$dateの「~」の前までを削除する 2.日付を数字に変換(?) 3.ソートして一旦格納 4.foreachで表示を繰り返す って感じですよね? この1~3の仕方がさっぱりわかりません。方法を教えてください。 言語はジャンルでも書いてあるとおりperlです。 抜けている情報があったら指摘してください。すぐに書込みします。 以上お願いします。

    • ベストアンサー
    • Perl
  • データの日付でソートをしたい

    データの日付でソートをしたい データの日付でソートをしたいと思ってますが、うまくいっていません。 $kuchikm2の内容 1,8,,説明文,2010/07/06-01:27,1,,,,,,, 2,8,,紹介文,2010/07/18-02:27,1,,,,,,, 3,8,,コメント,2010/05/19-03:27,1,,,,,,, 4,8,,文言,2010/06/20-04:27,1,,,,,,, ソートした結果@sorted 2,8,,紹介文,2010/07/18-02:27,1,,,,,,, 1,8,,説明文,2010/07/06-01:27,1,,,,,,, 4,8,,文言,2010/06/20-04:27,1,,,,,,, 3,8,,コメント,2010/05/19-03:27,1,,,,,,, (perlソース) 略 #sortロジック use warnings; my @lines = $kuchikm2; print @lines, " a\n"; my @sorted = map { $_->[4] } sort { $a->[0] <=> $b->[0]} map { [(split q{,}, $_)[4], $_] } @lines; print @sorted, " b\n"; (ここまで) 以前ソートで質問したときに、数字でないといけないと言われたような気がしています。 お手数かけます。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Strutsでの質問

    Strutsでの質問 いつもお世話になっております。 <html:optionsCollection>使った際の実装のさせ方がわからない為、困っております。 birthday.jsp //省略 生年月日 <html:select property="year" > <html:optionsCollection name="UserCheckForm" property="year_map" value="key" label="value" /> </html:select>年 <html:select property="month" > <html:optionsCollection name="UserCheckForm" property="month_map" value="key" label="value" /> </html:select>月 <html:select property="days" > <html:optionsCollection name="UserCheckForm" property="days_map" value="key" label="value" /> </html:select>日<br/><br/> ActionForm、Actionではどのように定義しておけばいいのでしょうか? ActionFormでは //省略 LinkedHashMap<String, String> year_map = new LinkedHashMap<String, String>(); year_map.put("01", "1970"); year_map.put("02", "1971"); year_map.put("03", "1972"); year_map.put("04", "1973"); year_map.put("05", "1974"); year_map.put("06", "1975"); year_map.put("07", "1976"); year_map.put("08", "1977"); LinkedHashMap<String, String> month_map = new LinkedHashMap<String, String>(); month_map.put("01", "01"); month_map.put("02", "02"); month_map.put("03", "03"); LinkedHashMap<String, String> days_map = new LinkedHashMap<String, String>(); days_map.put("01", "01"); days_map.put("02", "02"); days_map.put("03", "03"); でもこれっておかしいですよね・・・。 ActionFormにはsetterとgetterを実装しなければいけないのに。 setterはこんな感じになるんでしょうか。 public void setYear_map(){ year_map.put("key","value"); } でもこれだと動的にキー名と値が入らず、1個分しか出来ないですよね…。 どうしたらいいかわからないのでどなたか教えて頂ければ幸いです。 また結構なサイトみてますが、イマイチわかりません。 参考URLをご提示の場合はどのへんを参考にすればいいか 教えて頂ければと思います。 申し訳ありませんが、宜しくお願い致します。

    • ベストアンサー
    • Java
  • データファイルのソート方法について

    perlで使用している、データファイルのソート方法について質問いたします。 やりたいこと。 1.ファイルを読み込み 2.指定されている文字列でソートをして 3.同じファイルに格納する 以上になります。 以下のファイルにデーターが入ってます・ namedata.cgi 田中,4 佐藤,2 鈴木,1 水野,3 このファイルをソートして以下のように並び替えて保存したいと思ってます。 スクリプトを実行後 namedata.cgi 鈴木,1 佐藤,2 水野,3 田中,4 となっていてほしいのです。 スクリプト sort.cgi 略・・・ #ふぁいる読み込み open(DB,"<$file") || &error("Can't write $file"); flock(DB, 1); @lines = <DB>; close(DB); #ソート @result = sort { $a <=> $b } @lines; #ファイル書き込み open(DB,">$file") || &error("Can't write $file"); flock(DB, 2); print DB "@result"; close(DB); ファイルの2項目目が分からないからソートされていないような気がするのですが、記述方法がわかりません。 ファイル読み込み時にforeachを使用して読み込まないとだけなのでしょうか? うまく説明できていないかもしれませんが、よろしくお願いいたします。

    • ベストアンサー
    • Perl

専門家に質問してみよう