-PR-
解決済み

多次元配列でソートしたい

  • 困ってます
  • 質問No.460150
  • 閲覧数716
  • ありがとう数2
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 87% (368/420)

たとえば、Yahooオークションとかで、「商品名」「価格」「残り日数」が表示されていて、
それぞれをクリックすると、その列をソートして全体を昇順・降順に並べ替えてくれますよね。
あれを自前のCGIで実現したいのです。
たとえば、3次元配列$hoge[X][Y][Z]を定義し、ここがクリックされたらXをキーにソート、ここがクリックされたらYでソートということをやりたいと思っているのですが、当然こういう機能は無いわけで、自分で作らなくてはいけません。
連想配列とかポインタとか色々考えたのですが、うまく行かず・・・。
どのような実装方法があるでしょうか、アイデアをお聞かせ願えたら嬉しいです。
通報する
  • 回答数1
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.1
レベル12

ベストアンサー率 75% (398/526)

よく使われる手法は、
・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

お礼率 87% (368/420)

詳細な解説ありがとうございました。
リファレンスは扱ったことがなかったため、勉強してみようと思います。混乱していた考えにだいぶ方向性が見えてきました。感謝いたします。
投稿日時 - 2003-02-03 18:16:39
このQ&Aのテーマ
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-

特集


開業・独立という夢を持つ人へ向けた情報満載!

ピックアップ

ページ先頭へ