2次元配列のデータをソートする方法

このQ&Aのポイント
  • 2次元配列のデータをソートする方法がわからない
  • データの項目(商品コード、商品名など)数は固定で、データ数や内容は変化する
  • array_multisort関数は使えないので、別の方法を教えてほしい
回答を見る
  • ベストアンサー

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
  • ありがとう数3

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

  • ベストアンサー
  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.2

例えば、金額での昇順ソート $data_max = 1000 ; //データの個数 $s = 2 ; // 3番目の金額なので for ($i=0 ;$i<$data_max ;$i++){   $sort[$i] = $i ; } for ($i=0 ;$i<$data_max-1 ;$i++){ for ($j=0 ;$j<$data_max ;$j++){ if ( $data[$sort[$i]][$s] > $data[$sort[$j]][$s] ){ // このifの判定をいじれば昇順降順などを操作できます $k = $sort[$i] ; $sort[$i] = $sort[$j] ; $sort[$j] = $k ; } print "$data[sort[$i]][0] $data[sort[$i]][1] $data[sort[$i]][2] $data[sort[$i]][3]\n" ; }

Masa333
質問者

お礼

お礼が遅くなって済みませんでした。 回答ありがとうございます。 2次元配列をソートする関数のようなものはないのですね。 回答いただいたロジックを用いてソートができるようになりました。 アルゴリズムはあまり理解していなかったので、これを機に勉強したいと思います。 ありがとうございました。

その他の回答 (1)

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

まず基本的なアルゴリズムとかを覚えたほうが良いと思いますよ。 ソートは クイックソート バブルソート などが有名なアルゴリズムですね。 これらを踏まえて、PHPに置き換えれば良いですね。

関連するQ&A

  • 二次元配列のソート 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
  • 多次元配列でソートしたい

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

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

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

  • 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
  • 2次元配列のソート方法

    配列ソートに関して教えて頂きたいのですが、次のような配列を降順でソートするにはどのようなコードを書けば良いのでしょうか。 $a[] = array(4 => "four"); $a[] = array(3 => "three"); $a[] = array(20 => "twenty"); $a[] = array(10 => "ten"); usortなどを試したのですが、知識不足のためかどうも上手く動きません。 以上、よろしくお願いします。

    • 締切済み
    • 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
  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

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

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

    • 締切済み
    • PHP
  • 多次元配列のソートについて

    始めまして。 多次元配列のソート方法について分からないことがある為教えていただけないでしょうか。 $a[0] = array('2007/3/1','あ100','その他'); $a[1] = array('2007/3/1','あ200','その他'); $a[2] = array('2007/3/2','あ200','その他'); $a[3] = array('2007/3/2','あ300','その他'); $a[4] = array('2007/3/3','あ50','その他'); 上記のような配列があった場合、usort関数でやると、日付かその後ろの数値の値を元にソートできますが、両者の関係を持たせたソートは可能でしょうか。 結果としては $b[0] = "2007/3/3 あ50"; $b[1] = "2007/3/2 あ200"; $b[2] = "2007/3/2 あ300"; $b[3] = "2007/3/1 あ100"; $b[4] = "2007/3/1 あ200"; というようにしたいのです。 よろしくお願いします。

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

    2次元配列で次のCSVファイルがあります。 フォームから入力したのですが、txtファイルには項目名(列名)が保存されていません。 taro,10,119 jiro,10,90 hanako,9,120 momoko,11,98 saburo,12,111 natuyo,10,130 sirou,8,88 このデータを年齢順、及び身長順に並べ替えをしたいのです。 列の名前がないので、手動でtxtファイル1行目に simei,toshi,shinchou と追記して 01: <?php 02: $data = "c:\××\××\shinchou.txt"; 03: $array = file($data); 04: foreach($array as $key => $row){ 05: $toshi[$key] = $row["toshi"]; 06: $shinchou[$key] = $row["shinchou "]; 07: } 08: print_r($array); 09: array_multisort($toshi,SORT_ASC, $shinchou,SORT_ASC, $array); 10: ?> と実行しましたが、 Array ( [0] => simei,toshi,shinchou  [1] => taro,10,119 ・・・・と、print_r($array)の結果が出るだけで、ソートが出来ません。 CSVファイルで項目名(列名)が無い場合の並べ替えはどのようにすれば良いでしょうか。 mySQLなどを利用しないと並べ替えは出来ないでしょうか。

    • ベストアンサー
    • PHP

専門家に質問してみよう