人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPでソートの質問。

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

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

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

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

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

●質問者: pipi_n
●カテゴリ:ウェブ制作
✍キーワード:PHP ソート データ ファイル 数字
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● okuryu
●27ポイント

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";

}


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

◎質問者からの返答

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


2 ● tezcello
●27ポイント

単に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 )

◎質問者からの返答

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


3 ● chankaz
●26ポイント

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

◎質問者からの返答

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

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

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

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

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

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


4 ● chankaz
●10ポイント

> 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...

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ