街中で見かけて「グッときた人」の思い出

配列のソートの質問です。
初心者です。よろしくお願いいたします。

//---テキストファイルの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

の早い順にソートするには
どうしたらよいでしょうか?
お教えください。

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/06/24 12:40

早い順のソートとは?


またもともと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>";
}

?>

この回答への補足

ありがとうございました。
書き方が不十分で、すみません。

先頭の数字で
ユーザー 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 なら、解答した時間順にソートしたいのです。

よろしくお願いします。

補足日時:2010/06/24 10:32
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/07/31 09:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!