- ベストアンサー
自前のCGIで多次元配列をソートする方法は?
- Yahooオークションのようなソート機能を自前のCGIで実現したい場合、多次元配列を利用する方法があります。
- 具体的には、3次元配列を定義し、クリックされた要素に基づいて配列をソートすることができます。
- 連想配列やポインタを利用することも考えられますが、多次元配列を使う方法がシンプルで実装しやすいです。
- みんなの回答 (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} に正常な値が入っていないと実行エラーとなるので、デフォルト設定などをして下さい。
お礼
詳細な解説ありがとうございました。 リファレンスは扱ったことがなかったため、勉強してみようと思います。混乱していた考えにだいぶ方向性が見えてきました。感謝いたします。