過去ログ 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』もよろしかったらお試しください。 こーちゃんさん、すえぽんさん、どうもありがとうございました。
一定時間書込が無かったので過去ログに移りました
|
|