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

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

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

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

  • Perl
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • Pythonの2次元配列のソート

    Python3の2次元配列のソートについて教えて下さい [[1, 2], [1, 3], [2, 4]]のようなリストのソートで 昇順ソートでインデックス0が同じならインデックス1は降順でソートしたいと思ってます。 結果が以下のようになるようにしたいです 1 3 1 2 2 4 よろしくおねがいします。

  • 二次元配列のソート PHP

    タイトルのとおりソートを行ってくれる関数を探しております。 $buf[][]の二次元配列の変数を日付の降順に並べ替えたいのですが、そういった関数は用意されていますか? sort()、rsort()では不可能かと思います。 以下、二次元配列の値です。配列三番目の日付の降順で再格納したいです。 ( [0] => Array ( [0] => 1[1] => name1 [2] => 2006-08-18 ) [1] => Array ( [0] => 2 [1] => name2[2] => 2006-08-28 ) [2] => Array ( [0] => 3[1] => name3 [2] => 2006-08-18 ) [3] => Array ( [0] => 4 [1] => name4[2] => 2006-08-18 ) よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 多次元配列のソートについて

    名前とテストの点, クラスが格納されている 以下のような多次元配列があるとします。 $data[0][0] = 'yamada'; $data[0][1] = '20'; $data[0][2] = 'B'; $data[1][0] = 'katoh'; $data[1][1] = '45'; $data[1][2] = 'A'; $data[2][0] = 'honda'; $data[2][1] = '15'; $data[2][2] = 'E'; $data[3][0] = 'ooyama'; $data[3][1] = '100'; $data[3][2] = 'C'; 上記の配列を得点順にソートして表示したいのですが どのようにすればうまく(昇順、降順)で表示できるのでしょうか?

    • 締切済み
    • PHP
  • 2次元配列のソート

    2次元配列のデータをソートしたいのですが方法がわかりません。初歩的な質問ですが、ご存知の方、よろしくお願いいたします。 (例) 商品コード、商品名、金額、有効期限のデータを以下のように持っています。 $data[0] = ("001", "商品A", 5200, "2004/5"); $data[1] = ("002", "商品B", 350, "2005/1"); $data[2] = ("003", "商品C", 10800, "2004/3"); ・・・・ データの項目(商品コード、商品名など)数は固定ですが、データ数、内容は変化します。 2次元配列でデータがあり、商品コードで降順にソート、金額で昇順にソートなどのソートを行う方法はありますか? No.760468 で同じような質問があり、array_multisort が回答としてあがっていましたが、上記データの場合ソートできないようなので質問させていただきました。 なお、環境によりデータベースを使用することはできません。

    • ベストアンサー
    • PHP
  • 2次元配列のソート

    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2次元配列のソート $aは2次元配列で、2次元目は連想配列です。 $aの実際の値は以下です。 ('苗字'=>'いけだ', '名前'=>'せいじ'), ('苗字'=>'たなか', '名前'=>'えつし') 2次元目の'名前'でソートを実行し、以下のように整列させるソースを教えてください。 ('苗字'=>'たなか', '名前'=>'えつし'), ('苗字'=>'いけだ', '名前'=>'せいじ') xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    • ベストアンサー
    • PHP
  • 2次元配列 ソート

    はじめまして。 FLASH8を使っています。 2次元配列のソートがうまくいかず困っています。 Array[0][0] = "かかか"; Array[0][1] = "ききき"; Array[0][2] = "くくく"; Array[1][0] = "あああ"; Array[1][1] = "いいい"; Array[1][2] = "ううう"; とあって2番目の要素(「ききき」「いいい」の部分です)をキーとしてArray[n]を昇順にソートしたいのです。 この場合結果としては、 Array[0][0] = "あああ"; Array[0][1] = "いいい"; Array[0][2] = "ううう"; Array[1][0] = "かかか"; Array[1][1] = "ききき"; Array[1][2] = "くくく"; となります。 ご存知の方がいらっしゃいましたら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • 配列のソートについて

    Array(    [0] => ../images/19991221.gif    [1] => ../images/19980801.png    [2] => ../2007/20070402.jpg    [3] => ../2009/20091231.jpg    [4] => ../../images/hoge/19950101.jpg    [5] => ../piyo/19951231.jpg ) 配列(階層の異なるパス)を、拡張子を除いたファイル名「20091231、20070402…」で、配列のまま、降順ソートしたいのですが、どうすればよいでしょうか? ファイル名だけを並べたいわけではなく、 ファイル名降順で、配列をソートしたいです。 ※このパスは後で使う予定のため

    • ベストアンサー
    • PHP
  • 多次元配列の並び変えについて

    <?php $food["a"]["1"]= "hoge1"; $food["b"]["2"]= "hoge2"; $food["c"]["3"]= "hoge3"; $food["d"]["4"]= "hoge4"; ?> 上記の配列について、1,2,3,4のキーの順番でソートしたいのですが、うまく出来ません。 一次元配列だと簡単なのですが、二次元配列だとどうやったらよいのでしょうか? array_multisortを使うと、多次元でも並び変えはできると他のサイトで読みましたが、 これは結局値でソートしてますよね? 私は純粋にキーのみでソートしたいのですが、色々調べているのですがどうも複雑なプログラムを 書かないとできないような気がしてきました。

    • 締切済み
    • PHP
  • 二次元配列でソートがしたい

    二次元配列でソートがしたい 二次元配列でソートがしたい 開発環境:Visual Web Developer 2008 express 言語:Visual Basic 上記開発環境でWebアプリケーションを開発中です。 TextBoxを縦20行横10列の表形式に配置し、左から2番目の列に入力された数値をキーに、昇順に並べ替えができるような入力フォームを作成していますが、参考になるようなサイトが見つからなかったので、どなたか参考になるサイトやサンプルロジックを教えて頂けないでしょうか? よろしくお願いします。

  • 3次元配列から2次元配列に

    3次元配列のデータを2次元配列に移すにはどのように したらよいのでしょうか.とりあえず下記のように考えてみましたが. data3[500][500][4000]; //3次元配列 data2[500][500]; //2次元配列 for(y=0; y<500; y++) for(x=0; x<500; x++){ for(z=0; z<4000; z++){ data2[y][x] = data3[y][x][z]; } } } これでいいのでしょうか?