• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:多次元配列でソートしたい)

自前のCGIで多次元配列をソートする方法は?

このQ&Aのポイント
  • Yahooオークションのようなソート機能を自前のCGIで実現したい場合、多次元配列を利用する方法があります。
  • 具体的には、3次元配列を定義し、クリックされた要素に基づいて配列をソートすることができます。
  • 連想配列やポインタを利用することも考えられますが、多次元配列を使う方法がシンプルで実装しやすいです。

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答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} に正常な値が入っていないと実行エラーとなるので、デフォルト設定などをして下さい。

pythian
質問者

お礼

詳細な解説ありがとうございました。 リファレンスは扱ったことがなかったため、勉強してみようと思います。混乱していた考えにだいぶ方向性が見えてきました。感謝いたします。

関連するQ&A