PHPでソートの質問。


データが入っているファイルがあります。
中身は

ああああ<>かかかか<>2
いいいい<>きききき<>1
うううう<>くくくく<>3

という<>で区切ったデータです。
このファイルを3番目の要素(数字の部分)でソートして

いいいい<>きききき<>1
ああああ<>かかかか<>2
うううう<>くくくく<>3

というふうにしたいのですが、どうしたらよいでしょう?

回答の条件
  • 1人5回まで
  • 登録:2006/05/03 11:00:00
  • 終了:2006/05/10 11:00:06

回答(4件)

id:okuryu No.1

okuryu回答回数72ベストアンサー獲得回数32006/05/03 17:05:38

ポイント27pt

http://jp2.php.net/manual/ja/function.array-multisort.php


$file = file('hoge.dat');


foreach ($file as $line) {

$dat = explode('<>',rtrim($line));

$data[] = array(

'first' => $dat[0],

'second' => $dat[1],

'third' => $dat[2]

}

}


foreach ($data as $key => $row) {

$first[$key] = $row['first'];

$second[$key] = $row['second'];

$third[$key] = $row['third'];

}


array_multisort($third,SORT_ASC,$data);


foreach ($data as $dat) {

$line = implode('<>',$dat);

echo $line."¥n";

}


動作確認していませんがこんな感じでどうでしょう。

id:pipi_n

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

2006/05/08 10:37:49
id:tezcello No.2

tezcello回答回数460ベストアンサー獲得回数692006/05/03 17:10:46

ポイント27pt

単に3項目目でソートするだけなら、

3項目目がキー、1行が値 となるようの読み込み、キーでソートします。

具体的にはこんな感じ。

$arrya = file("sorttest.txt"); // 先ずは配列に読み込んで

foreach($arrya as $a){

$a = trim($a); // 不要な文字を削除

$b = preg_replace('/(.*<>.*<>)(\d+)/', '\\2', $a); // 2回目の<>以降の数字を抜き出して

$arryb[$b] = $a; // それをキーにした配列に代入

}

print_r($arryb); // 動作確認用

ksort($arryb); // キーでソートする

print_r($arryb); // 動作確認用

?>

とりあえず実行してみた所、以下のようになりました。(改行してあります)

Array ( [2] => ああああ<>かかかか<>2 [1] => いいいい<>きききき<>1 [3] => うううう<>くくくく<>3 )

Array ( [1] => いいいい<>きききき<>1 [2] => ああああ<>かかかか<>2 [3] => うううう<>くくくく<>3 )

id:pipi_n

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

2006/05/08 10:38:03
id:chankaz No.3

chankaz回答回数53ベストアンサー獲得回数32006/05/03 19:22:21

ポイント26pt

usort() でできます。

// 任意の値を取り出して比較(この場合は3番目の要素)
function cmp($a, $b) {
	list(,,$aa,) = explode('<>', $a);
	list(,,$bb,) = explode('<>', $b);
	if ($aa == $bb) {
		return 0;
	}
	return ($aa < $bb)? -1 : 1;
}
$lines = file('データファイルの名前');	// データファイルを配列に入れる
usort($lines, "cmp");	// 上記の関数でソート

http://www.php.net/manual/ja/function.usort.php

id:pipi_n

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

一番簡潔でわかりやすかったです。

今回の質問に関係ないですけど

return ($aa < $bb)? -1 : 1;

の「? -1 : 1」の意味は何でしょう?

調べてみたのですがイマイチ理解できなくて・・・

2006/05/08 10:41:53
id:chankaz No.4

chankaz回答回数53ベストアンサー獲得回数32006/05/08 22:01:45

ポイント10pt

> return ($aa < $bb)? -1 : 1;

> の「? -1 : 1」の意味は何でしょう?

if ($aa < $bb) {	// $aa の方が小さければ「-1」を返す
	return -1;
} else {	// $aa の方が大きければ「1」を返す
	return 1;
}

と同じです。

今回の場合だと、配列に入れたデータを比較して、各行の3番目の要素(数字)の値が

  1. 等しければそのまま
  2. 小さければ順番が上に
  3. 大きければ順番が下に

なります。


「三項演算子」 http://www.php.net/manual/ja/language.operators.comparison.php#l...

  • id:bonlife
    id:chankazさんの回答を開けさせていただきました。
    三項演算子、勉強になりました。
    ありがとうございます。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません