ラウンジ(兼FAQ掲示板)

あんQ 2.01での回答項目ソートについて
過去ログ NO.1081001903
□ こ〜ちゃん [2004年03月23日17時23分]
あんQ 2.01を使用していますが、回答項目を「登録順」に表示させたいと
考えています。
ソースをいろいろといじってみましたが、希望どおりのソートはできませんでした。

過去記事の検索をしても、この件については

http://lounge.suepon.com/data/1051444894.html
にありましたが、解決されずに過去ログ送りになっていました。

ソースの修正点を教えていただければ幸いです。
よろしくお願いいたします。
□ NXer [2004年03月23日23時14分]
はじめまして。NXerです。

>ソースの修正点
----------------------------------
226 #sort $key change
# $key{$_} = $point;
$key{$_} = $num;
}
----------------------------------
==説明==
#は元のスクリプトに、あとで修正が出来るように
しかし、プログラムとしては無効になるように付けたもの。
ソート(並べ替え)のキーを得票ポイントから登録数値に変更。

ローカル・サーバーで運用した結果です。
----------------------棒グラフコピー不可、省略
1 さくら 1 25.00%
2 ばら  2  50.00%
3 紫陽花 1 25.00%
-------------------------------------

>回答項目を「登録順」

にしたつもりですが、お試しください。

ご希望どおりの変更は可能ですが、選択項目間の比較
をする時、得票率の降順が最も分りやすいような気が
しました。特に項目数が10に近くなると、そうです。

この点を改善するには、得票率順と登録順の選択を可能
にするプログラムの変更が必要になります。
それは、新たなる挑戦そして楽しみですね。
成功されましたら、教えてください。よろしく。
□ こ〜ちやん [2004年03月24日09時31分]
すばやいreplyありがとうございます。

> 226 #sort $key change
> # $key{$_} = $point;
> $key{$_} = $num;
> }

私もココだとにらんでいたのですが、このように変更したら棒グラフのwidthの数値 ($len)に異常な数値を吐き出すようで 最大幅($max)を超えた棒グラフが出来てしまいます。
これがその状態です。
http://hpcgi1.nifty.com/kouichi/anq/anq.cgi?data=20031019130329
この部分で引っかかってしまって、改造を敢え無く断念。修正部分をコメント行にしました。
□ NXer [2004年03月24日20時08分]
> 改造を敢え無く断念

もし、まだ多少の「念」が残っておりましたら、以下を
よろしくお読みください。NXerです。

時間のない時は、下段のスクリプトをコピーペーストしてお試しください。
説明は、読まなくても動作すると思います。

> 最大幅($max)を超えた棒グラフ
原因はこれです。「超えた」は見かけであることに気が付きました。
関連する行です。

233 $scl = $max / $point;

$pointが次のようになっているとします。

1 さくら 1
2 バラ  8
3 紫陽花 2

得票数降順にすると 233行から棒グラフのスケール(縮尺)が
2番バラ 8の最高得票数で決定されます。
すえぽんさんスクリプトを当方は登録順に変えました。
そのため、1番さくらの得票数は1。この結果、$maxが300ですから
縮尺率どころか倍率になり、結果は信じられない長い棒グラフ。
どうも驚かせて「すいません」でした。

原因の解決策は、233行目までを変更しないで
1 縮尺率を最高得票で得る
2 次にソートのキーを登録順の数値とする
3 再度ソートをする
というものです。
このとき
235 @sorted =();
はソート後の配列を格納するため、得票順で使った配列を
リセットします。終わりのセミコロンも忘れないでください。

--------------------------------------------インデントはずれるかも
222 $total = 0;
foreach (@lines) {
($num,$content,$point,$color,) = split(/\,/,$_);
$total += $point;
$key{$_} = $point;
}

foreach (sort { $key{$a} <=> $key{$b} } keys %key) { unshift (@sorted,$_); }
($num,$content,$point,$color,) = split(/\,/,$sorted[0]);
if ($point == < 0) { $point = 1; }
$scl = $max / $point;

235 @sorted =();     #配列のリセット ここから追加
foreach (@lines) {
($num,$content,$point,$color,) = split(/\,/,$_);
$key{$_} = $num;  #ソート用キーを登録順数値とする
}

foreach (sort { $key{$a} <=> $key{$b} } keys %key) { unshift (@sorted,$_); }
($num,$content,$point,$color,) = split(/\,/,$sorted[0]);

246 &header;
-------------------------------------------------------------
235行からheaderサブルーチンまでが追加行です。

結果の例==棒は省略 画面内に収まりました。
1 さくら 3   23.08%
2 ばら 8   61.54%
3 紫陽花 2 15.38%
======
実用化までには、まだ問題がでるかもしれません。
バージョンアップを完成していただくのにお役くに立つ
ことができる考え方や情報の提供になりましたでしょうか。
□ こ〜ちやん [2004年03月25日09時11分]
NXer さん、丁寧な解説ありがとうございました。
出していただいたルーチンを組み込んで確認した所、棒グラフも$max以内で収まり
項目も登録順になりました。

そこで欲を出して、初期設定で得票順か、登録順かを指定できるようにし、NXerさんのルーチン部等に条件判断を組み込みました。

「初期設定/アンケートテーマ」の次に次の項目を追加
----------------------------------------------
# 投票項目の並び替え方式
# 0:得票順
# 1:登録順
$sort_mode = 0;
----------------------------------------------

NXerさん提供のルーチンを以下のように変更
----------------------------------------------インデントはずれるかも
既存> $scl = $max / $point;

if ($sort_mode != 0) { # 配列のリセット ここから追加 2004.03.25 Thanks to NXer
@sorted = ();
foreach (@lines) {
($num,$content,$point,$color,) = split(/\,/,$_);
$key{$_} = $num; # ソート用キーを登録順数値とする
}

foreach (sort { $key{$a} <=> $key{$b} } keys %key) { unshift (@sorted,$_); }
($num,$content,$point,$color,) = split(/\,/,$sorted[0]);
}

既存> &header;
----------------------------------------------


そして、その数行下の投票画面の説明部に項目追加。
----------------------------------------------インデントはずれるかも
既存> print "■$repost<p>\n";
追加> if ($sort_mode == 0) { print "※投票する項目は現在 <b>得票順</b> で表\示されています<br>\n"; }
追加> else { print "※投票する項目は現在 <b>登録順</b> で表\示されています<br>\n";}
既存> print "<table border>\n";
----------------------------------------------

こんな感じで現在稼動しています。
http://hpcgi1.nifty.com/kouichi/anq/anq.cgi

NXerさん、ありがとうございました。
□ こ〜ちやん [2004年03月25日17時18分]
なんか、投票画面の説明部に追加した部分がイケてない感じだったので
以下のように修正しました。


そして、その数行下の投票画面の説明部に項目追加。
----------------------------------------------インデントはずれるかも
既存> print "■$repost<p>\n";
追加> print "※投票する項目は現在 ";if ($sort_mode == 0) {print "<b>得票順</b>";} else {print "<b>登録順</b>";} print "で表\示されています\n";
既存> print "<table border>\n";
----------------------------------------------

まだまだ改造の余地はありそうですが、とりあえずはこの状態で様子を見ます。
□ NXer [2004年04月03日23時18分]
少しレスが遅れました。NXerです。

>まだまだ改造の余地
こ〜ちゃんさんのきれいなスクリプトから次の様な変更を
思いつき試してみました。

1 初期設定部分の代わりにラジオボタンを使い、編集モードで
  選択する
2 選択した$sort_modeを$urlのあとにデータとして
  保存する
3 投票結果を、保存した登録順か得票順かで表示する
  その時、順位の名称をグラフの上に付ける

などです。
詳しくはすえぽんさんの電光!サポートサイト
homepage by xxx(ラウンジでの匿名性のため一部変更)
のタイトルページanqでご覧ください。変更した
『あんQ』もよろしかったらお試しください。
こーちゃんさん、すえぽんさん、どうもありがとうございました。

一定時間書込が無かったので過去ログに移りました

suepon.com | CGI作成/CGI制作 | JavaScript | ドメイン検索 | バナー自動作成 | Google ダンスツール | 松浦亜弥 | H.P.memo | パソコン | ネイル

Copyright (C) 2002 - 2008 suepon , All rights reserved. Powered by CGI Script Market.