
たとえば、Yahooオークションとかで、「商品名」「価格」「残り日数」が表示されていて、
それぞれをクリックすると、その列をソートして全体を昇順・降順に並べ替えてくれますよね。
あれを自前のCGIで実現したいのです。
たとえば、3次元配列$hoge[X][Y][Z]を定義し、ここがクリックされたらXをキーにソート、ここがクリックされたらYでソートということをやりたいと思っているのですが、当然こういう機能は無いわけで、自分で作らなくてはいけません。
連想配列とかポインタとか色々考えたのですが、うまく行かず・・・。
どのような実装方法があるでしょうか、アイデアをお聞かせ願えたら嬉しいです。
No.1ベストアンサー
- 回答日時:
よく使われる手法は、
・1つのデータはハッシュ(連想配列)で定義する
・ハッシュのリファレンスを配列で扱う
というものです。(あくまで1例です。)
例えばファイルに、1データ1行・項目カンマ区切りで「商品名」「価格」「残り日数」が入っている場合、
my @item;
open FH, "item.dat";
while (<FH>) {
chomp;
my ($name, $price, $days) = split /,/;
push @item, {name=>$name, price=>$price, days=>$days};
}
close FH;
として商品のリストを生成します。
また、前提として $FORM{sort} にソートする項目が入っているとします。
(値は、name price days のいずれかとします。)
同じく、$FORM{order} にソートオーダ(昇順・降順)を示すデータが入っているとします。
(値は、up down のいずれかとします。)
項目ごとに比較の仕方(数値比較か文字列比較か)が異なるので、ソート項目及びオーダごとの比較関数が必要になります。
各関数のリファレンスを $FORM{sort} と $FORM{order} をキーとするハッシュに入れておけば、ソートを行う部分がすっきりと書けます。
まずは比較関数の定義部
my %fn_sort = (
'name-up' => sub {$a->{name} cmp $b->{name}},
'name-down' => sub {$b->{name} cmp $a->{name}},
'price-up' => sub {$a->{price} <=> $b->{price}},
'price-down' => sub {$b->{price} <=> $a->{price}},
'days-up' => sub {$a->{days} <=> $b->{days}},
'days-down' => sub {$b->{days} <=> $a->{days}},
);
次にソートを行う部分
@item = sort { $fn_sort{"$FORM{sort}-$FORM{order}"}->() } @item;
$FORM{sort} や $FORM{order} に正常な値が入っていないと実行エラーとなるので、デフォルト設定などをして下さい。
詳細な解説ありがとうございました。
リファレンスは扱ったことがなかったため、勉強してみようと思います。混乱していた考えにだいぶ方向性が見えてきました。感謝いたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel VBAで並べ替えをしたい 3 2023/02/25 09:31
- Excel(エクセル) 結合セルのソートについて 5 2022/04/22 11:57
- Excel(エクセル) Excelの50音順ソートを全ての行列に適用するには? 4 2022/12/05 11:28
- その他(プログラミング・Web制作) sortの優先キーについて(スプレッドシート) 1 2023/01/17 17:59
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Excel(エクセル) エクセルでの色付け 5 2022/10/09 18:58
- Excel(エクセル) 重複しているか否かをソートせずに判断する方法ありますか? 2 2022/07/06 21:16
- Java Java配列の問題を教えてください。 乱数で20個出力し、最大、最小、合計、平均を求め、更に昇順にソ 3 2023/07/10 18:32
- Excel(エクセル) オフィスをLibreOfficeからmicrosoft 2013に変えました。 1 2022/05/09 00:28
- Excel(エクセル) Excel 効率的な名簿と得点の管理の仕方 8 2022/08/07 08:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6の公式リファレンスはありま...
-
pythonでファイルのコメント行...
-
スパゲティソースについて
-
配列から網羅的な文字列を生成...
-
変則的なスタック配列を使う
-
最後のフィールドを抜き出したい。
-
明示的なオブジェクトの削除
-
エクセルのVBAで最終行までルー...
-
VB.NETでFTPプログラム
-
ループフリー
-
UWSCの終了の仕方
-
配列表示画面方法について
-
perlでファイルの拡張子を除い...
-
配列変数に格納の仕方
-
ファイルからデータを読み込ん...
-
サブルーチンの戻り値
-
if elsif 構文と複数の配列の使用
-
配列へのプラス?
-
リファレンスについて 1
-
配列データの並び替えについて。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6の公式リファレンスはありま...
-
C言語について。
-
ファイルからデータを読み込ん...
-
双方向リスト(?)
-
PerlでXMLのフィルタリング
-
変数名を任意の数だけ増やしたい。
-
Perlで縦横変換のような事をし...
-
二つの変数が同じ物を指すよう...
-
JAVAのリファレンスについて
-
HTML::TemplateのTMPL_LOOPにつ...
-
多次元配列でソートしたい
-
画面を強制的に再描画させる方法
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
VBのReturnの使い方
-
流れ図(フローチャート)が分か...
-
CSVファイルの特定の行だけを読...
-
範囲指定したセルを1つずつ飛...
-
VBAでの一時停止と再開の方法
-
乱数の桁数指定、または範囲指定。
おすすめ情報