配列のソートについての質問

このQ&Aのポイント
  • 初心者の方から、配列のソートに関する質問です。具体的には、テキストファイルから読み込んだ配列をソートする方法について教えてください。
  • 質問者はテキストファイルから読み込んだ配列をソートしたいと考えています。ソート後の配列の要素を出力する際、特定の条件でソートを行いたいとしています。
  • 具体的には、配列の要素が同じ場合にさらに別の条件(日時)でソートする方法を知りたいとしています。この条件を満たすソートの方法についてアドバイスを求めています。
回答を見る
  • ベストアンサー

配列のソートの質問です。

配列のソートの質問です。 初心者です。よろしくお願いいたします。 //---テキストファイルの1行目を読み込んで配列にいれました----------- for($i = 1; $i < 51; $i++){ $fq = fopen("../4c/4c$i/+score.txt", 'r'); $fr = fgets ($fq); $frr = rtrim($fr); $line[$i-1] = "$frr <font color=blue>4c$i</font>"; fclose ($fq); } //-----その配列をソートしました--------------- rsort($line,SORT_NUMERIC); foreach ($line as $tmp){ print "$tmp<br>"; } //---すると 22,問題番号→,1239,2010/06/22/Tue/11/41/24 4c1 22,問題番号→,1239,2010/06/22/Tue/11/40/54 4c26 22,問題番号→,1239,2010/06/22/Tue/11/42/48 4c28 22,問題番号→,1239,2010/06/22/Tue/11/52/33 4c23 22,問題番号→,1239,2010/06/22/Tue/11/42/15 4c20 //----以下省略------------------------------- となりました。 各行の先頭が 22 で同じとき 2010/06/22/Tue/11/41/24 2010/06/22/Tue/11/40/54 2010/06/22/Tue/11/42/48 2010/06/22/Tue/11/52/33 2010/06/22/Tue/11/42/15 の早い順にソートするには どうしたらよいでしょうか? お教えください。

  • PHP
  • 回答数2
  • ありがとう数11

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

なるほど先頭要素で降順に、4番目の要素で昇順にソートしたいのですね? usortで処理してみてはどうでしょうか? <?PHP $line=Array( "100,問題番号→,1239,2010/06/22/Tue/11/41/24 4c1" ,"50,問題番号→,1238,2010/06/22/Tue/11/50/31 4c21" ,"20,問題番号→,1237,2010/06/22/Tue/11/44/15 4c10" ,"100,問題番号→,1239,2010/06/21/Tue/11/42/48 4c30" ,"100,問題番号→,1239,2010/06/22/Tue/11/42/48 4c28" ,"50,問題番号→,1238,2010/06/22/Tue/11/52/33 4c23" ,"100,問題番号→,1239,2010/06/22/Tue/11/40/54 4c26" ,"20,問題番号→,1237,2010/06/22/Tue/11/42/15 4c20" ); usort($line,"cmp"); foreach ($line as $tmp){ print "$tmp<br>"; } function cmp($a, $b){ $aa=explode(",",$a); $bb=explode(",",$b); if($aa[0] < $bb[0]) return 1; if($aa[0] > $bb[0]) return -1; if($aa[3] < $bb[3]) return -1; if($aa[3] > $bb[3]) return 1; return 0; } ?>

参考URL:
http://www.php.net/manual/ja/function.usort.php
ttaa100kkaa
質問者

お礼

ありがとうございました。助かりました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

早い順のソートとは? またもともとrsortで「SORT_NUMERIC」でソートをしている意味はあるのですか? 単純に前方から比較してソートを昇順におこなうなら sortでSORT_STRINGで行ってみてはどうでしょう? <? $line=Array( "22,問題番号→,1239,2010/06/22/Tue/11/41/24 4c1" ,"22,問題番号→,1239,2010/06/22/Tue/11/40/54 4c26" ,"22,問題番号→,1239,2010/06/22/Tue/11/42/48 4c28" ,"22,問題番号→,1239,2010/06/22/Tue/11/52/33 4c23" ,"22,問題番号→,1239,2010/06/22/Tue/11/42/15 4c20" ); rsort($line,SORT_STRING); foreach ($line as $tmp){ print "$tmp<br>"; } ?>

ttaa100kkaa
質問者

お礼

ありがとうございました。

ttaa100kkaa
質問者

補足

ありがとうございました。 書き方が不十分で、すみません。 先頭の数字で ユーザー 4c1,4c26,4c28,4c23,4c20 の順位をつけようとしています。 22,問題番号→,1239,2010/06/22/Tue/11/41/24 4c1 22,問題番号→,1239,2010/06/22/Tue/11/40/54 4c26 22,問題番号→,1239,2010/06/22/Tue/11/42/48 4c28 21,問題番号→,1238,2010/06/22/Tue/11/52/33 4c23 20,問題番号→,1237,2010/06/22/Tue/11/42/15 4c20 となってしまうので、 22,問題番号→,1239,2010/06/22/Tue/11/41/24 4c1 22,問題番号→,1239,2010/06/22/Tue/11/40/54 4c26 22,問題番号→,1239,2010/06/22/Tue/11/42/48 4c28 を 22,問題番号→,1239,2010/06/22/Tue/11/40/54 4c26 22,問題番号→,1239,2010/06/22/Tue/11/41/24 4c1 22,問題番号→,1239,2010/06/22/Tue/11/42/48 4c28 となるようにするには、 どうしたらよいでしょうか? 同じ 22 なら、解答した時間順にソートしたいのです。 よろしくお願いします。

関連するQ&A

  • 配列をソートさせたとき、もう一方の配列も同じようにソートさせたい

    タイトルが意味不明で申し訳ありません。 二つの配列があるとします。 片方には文字列、もう片方には数値が記録されているもので、最大添え字は同じです。 この数値の大きい順に並べ替えを行いたいのですが、 name[0]とcount[0] name[1]とcount[1] ・ ・ をペアで並べ替えたいのですが、その方法が分かりません。 sort関数を使うとどうしても片方のみしかソートできないし、バブルソートを用いて試みましたが、どうも並び替えられません。 連想配列を使う考えもありましたが、2つの配列をどうやって一つのハッシュに格納すればいいか分からず断念しました。 バブルソートの方にバグがあるのかもしれませんが、何か方法があればご教授いただけると幸いです。 よろしくお願いします。 バブルソート部分のソース(配列は@filelistと@countを使用) # ソート処理 for($i=0;$i<$#filelist;$i++){ for($j=0;$i<$j;$j++){ if($count[$i]<$count[$i+1]){ $tmp=$count[$i]; $count[$i]=$count[$i+1]; $count[$i+1]=$tmp; $tmp=$filelist[$i]; $filelist[$i]=$filelist[$i+1]; $filelist[$i+1]=$tmp; $k=$j; } $i=$k; } }

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

    配列をソートした時、もともとデータのあった配列番号を記憶しておきたいのですが いい方法はないでしょうか (31,55,84,20,96,14); //1 2 3 4 5 6 ↓ (14,20,31,55,84,96) //6 4 1 2 3 5    ※ソート前の配列番号 いくつかの行(配列A)の、違う列にあるデータを抜き出して配列Bにまとめた後、配列Bをソート その後、配列Bのもともとの順番の位置の行にあるデータを上からコピーしていく感じで行ごとのソートを考えています イメージはこんな感じです a[0]=[1,512,200]; a[1]=[3,100,1]; a[2]=[4,100,265]; a[3]=[8,300,1]; //ソート対象を抜き出す b[0]=a[0][1]; b[1]=a[1][2]; b[2]=a[2][0]; b[3]=a[3][1]; b.sort(); c[0]=a[b[0]のソート前の配列番号]; c[1]=a[b[1]のソート前の配列番号]; c[2]=a[b[2]のソート前の配列番号]; c[3]=a[b[3]のソート前の配列番号];

  • 配列をソートしたいです

    配列をソートしたいです ArrayクラスのsortOn()を使って、 「x座標の大きい順」に順番をならべ変えたいのですが 上手く行きません。。 現在、配列を使い 3つの矩形のSpriteを配置しています。 ↓現在のコード ===================================== var arr:Array = new Array(); for(var i:int=0; i<3; i++){  arr[i] = new Sprite();  with(arr[i].graphics){   beginFill(0x666666);   drawRect(0,0,8,8);   endFill();  }  arr[i].x = i*10;  addChild(arr[i]); } ===================================== 今、各Spriteのxプロパティは  arr[0].x = 0;  arr[1].x = 10;  arr[2].x = 20; になっているのですが、 これをソートして  arr[0].x = 20;  arr[1].x = 10;  arr[2].x = 0; にならべ変えたいのですが、 どのように書けばいいのかがわかりません。。 今、このように書いてるのですが arr.sortOn(arr.x, Array.NUMERIC); 並べ替えができません、 (おそらく arr.x が駄目なのだと思うのですが。。) どなたかご存知の方いらっしゃいましたら どうかよろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 配列のソート 

    使用ソフト VB.NET 配列に入っている値の大きい順にソートする 値は重複することもある。その場合は配列の値が若いほうを優先 具体的には ロト6にて、出現した番号が多い順番にソートしたい。 date_last_st() には出現回数 date_sort() には出現回数が多い番号が順番にいれる 例 date_last_st(1)=2 date_last_st(2)=5 date_last_st(3)=2 の場合 date_sort(1)は2 date_sort(2)は1 date_sort(3)は3 となるようにしたい 一応自分で考えたのですがもっと簡素にできたりはしないのでしょうか? ---------------- Do For i = 1 To 43 If date_last_st(i) > date_max Then date_max_no = i date_max = date_last_st(i) End If Next date_last_st(date_max_no) = 0 date_sort(c) = date_max_no date_max = 0 c = c + 1 '1番~43番まですべて0か 判断 For i = 1 To 43 If date_last_st(i) = 0 Then date_TF = True Else date_TF = False Exit For End If Next '1番~43番まですべて0なら無限ループを抜ける If date_TF = True Then Exit Do End If Loop ---------

  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,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
  • java 配列のソートについて

    JAVAを現在独学で勉強中ですが、わからないコードがあります。 プログラミングの先輩方、暇なときにでも教えてください。 for(int i=0; i<test.length; i++){ String str =br.readLine(); test[i] =Integer.parseInt(str); } for(int s=0;s<test.length-1;s++){ for(int t=s+1; t<test.length;t++){ if(test[t]>test[s]){ int tmp =test[t]; test[t] =test[s]; test[s]=tmp } } } 2回目のtest.length-1の-1はどういった役割を果たしてるんでしょうか? またjavaの構文の中でも、配列のソートがどうしても苦手です。 何かソートを理解するのにコツみたいなものがあれば、ご教授ください。 宜しくお願い致します。

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

    PHPでデータベースの複数のテーブルから ID、名前、かな、点数といったデータを 読み込んでテーブルに保存しています。 SELECT id, name, kana, tensu FROM a, b, c ORDER BY tensu といった形で出来ると思っていたのですが エラーが出てできませんでした。 そこで各テーブルのデータを 読み込んで二次元配列にしてソート してみたのですが、なぜか以下のソースだと データが重複されて表示されて 困っています。 $saidai = count($tbl); for ($i=0 ;$i<$saidai;$i++){  $sort[$i] = $i; } for($i=0;$i<$saidai;$i++){  for($j=0;$j<$saidai;$j++){   if($tbl[$sort[$i]][2] > $tbl[$sort[$j]][2]){    $work = $sort[$i];    $sort[$i] = $sort[$j];    $sort[$j] = $work;   }  }  表示 } こんな感じですがどうも繰り返しても 同じデータばかりが表示されます。 いろいろ試してみましたが結局出来ませんでした。 表示するデータがかぶらないようにするには どうすればよろしいですか? お願いいたします。

    • ベストアンサー
    • PHP
  • 構造体配列の安定なソート

    出席番号と得点の配列を持つ構造体配列で、 出席番号順に並んだ状態でqsortを使って得点をソートする場合、 同じ得点の人でも、出席番号順はばらばらになってしまいますよね。 調べてみて、バブルソートなど安定なソートを使えばいいということが分かったのですが、 qsortは標準ライブラリにあって、 比較関数も見よう見まねで作ってなんとかなったのですが、 他の方法となると具体的にどうすればいいのか、 よくわからない状況です。 http://homepage1.nifty.com/daccho/program/algo/sort3.htm こちらのサイトのソースファイルを見て、 普通のint配列のバブルソートは出来たのですが、 構造体配列を、構造体の中の一つの要素をキーにバブルソートできるようにするには、 ここからどのように変更すればいいのでしょうか? 並び替える内容はint型だけなので、文字列をソートできるようにする必要はなく、 ソート対象も少ないので(上限100程度)、速度的な問題は考慮しなくて大丈夫だと思います。 Cは勉強中で、基本文法がわかるぐらいという状況で、 もしかしたら変なことを言っているのかもしれませんが、 よろしくお願いします。

  • 複数キーによるソート

    ここに、3つperlの配列があって、それぞれ問題番号、英単語、日本語訳が入っています。 これらを、例えば「英単語順」「問題番号順」などに並べ替えて先頭から順に取り出したいのですが、sort関数は配列ひとつに対してしか操作できないので、悩んでいます。 たとえば問題番号←→英単語の配列間に単語ごとのリンクを張って、片方をソートしてもリンクをたどるともう片方が取り出せるといったことはできるのでしょうか? また、配列のソートのルールを使って別の配列をソートする・・・といったことでも構いません。よろしくお願い致します。

    • ベストアンサー
    • Perl
  • 多次元配列の2つ目の項目でソートするには?

    今、とあるデータを csv と同じ形式で多次元配列にセットしています。 この多次元配列を for 文を使って TABLE タグを出力させて一覧表示しています。 データ部は数値順です。 function ListOut(){  var data = [   ["0x0140","CB_GETEDITSEL","エディット領域の選択範囲の取得",…], ←データは9項目ある(長いので省略)    :   ["0x0161","CB_INITSTORAGE","リストボックスのメモリ初期化",…],   [0,0,0,0,0,0,0,0,0], ←データの最後を表す  ];    for ( var i=0 ; table[i][0] != 0 ; i++ ){   ListOutSub( table, i ); ←ここで1データを TABLE 出力  } } 質問1:  『data』リストの2つ目の要素でアルファベット順にソートする方法が分かりません?  ソート方法が分かれば数値順以外にもアルファベット順で ListOutSub 関数などで一覧表示できる  と思っています。→データをアルファベット順にソートして定義するのは量からして避けたいです。  『sort』を使えば出来そうですが、第1引数に何を、どのように指定するのかが分かりません。  ※『ListOutSub』は自作関数で多次元配列の1データを TABLE タグで出力させるものです。 質問2:  データの最後を[0,0,…,0]として終わりを判定していますが、何かよい方法ありますか?  『table.length』を使ってみましたが上手く出来ませんでした。→『i < table.length』  多次元配列の場合では『length』は使えないのでしょうか?  指定方法が間違っているのならば正しい方法を教えて下さい。 上記の2つがわかる方、どうか教えてくれませんか? ちなみに JavaScrpit は今年始めたばかりの初心者です。→参考までに C/C++ 言語歴は14年 宜しくお願いします。→回答へのお礼は夕方以降になります。

専門家に質問してみよう