CSV形式のログファイルのソート方法を実現させるには

どのように考えれば良いでしょうか?

ログファイルに名前、ふりがな、性別、年齢でと有る場合に
フリガナ順で出力させるようにしたいです。

CSV
花子,はなこ,女,21
太郎,たろう,男,22
次郎,じろう,男,18

PHPスクリプト
$array = file("csv.csv");

$c = count($array);
$i = 0;


while($i < $c){
$array[$i] = trim($array[$i]);
list($name[$i],$sex[$i],$age[$i]) = split("\,",$array[$i]);
echo "<p>".$i."人目は".$name[$i]."です</p>";
$i++;
}

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2009/07/18 14:57:04
  • 終了:2009/07/25 15:00:02

回答(2件)

id:GoldenDawn No.1

GoldenDawn回答回数426ベストアンサー獲得回数812009/07/18 15:38:53

ポイント60pt

usort などによってソートしてやります。

<?php
$array = file("csv.csv") ;

$c = count($array) ;
$i = 0 ;


function cmp_furigana($a, $b) {
  $aa = explode(',', $a) ;
  $ab = explode(',', $b) ;

  return strcmp($aa[1], $ab[1]) ;
}
usort($array, cmp_furigana) ;


while($i < $c){
  $array[$i] = trim($array[$i]) ;
  list($name[$i],$sex[$i],$age[$i]) = split("\,",$array[$i]) ;
  echo "<p>".$i."人目は".$name[$i]."です</p>" ;
  $i++ ;
}


/*
// for ループによる実装
for ($i = 0; $i < count($array); ++$i) {
  list($name[$i], $sex[$i], $age[$i]) = explode(',', trim($array[$i])) ;
  echo "<p>".$i."人目は".$name[$i]."です</p>" ;
}
  */
?>

http://php.manual.php.to/function.usort.html

id:akide

回答ありがとうございます。

ソート部分が理解できません、、、考え方を教えていただけますか_?

2009/07/18 17:37:20
id:GoldenDawn No.2

GoldenDawn回答回数426ベストアンサー獲得回数812009/07/18 18:33:24

ポイント10pt

通常のソートでは配列の一つの要素として「花子,はなこ,女,21」という文字列全体が使われますが、

これを「はなこ」の部分だけにしたいわけです。


usort($array, cmp_furigana) ;

ソートは二つの要素の大小を比較して並べ換えますが、usort を使うと、この比較を行う関数を自分で定義できます。

ここでは cmp_furigana (ちなみに cmp は compare の略) と言う関数を定義していますが、create_function 関数で直接記述することもできます。


function cmp_furigana($a, $b) {

ここで cmp_furigana は比較する二つの要素、たとえば "花子,はなこ,女,21" と "太郎,たろう,男,22" という二つの文字列を受けとって $a、$b に格納します。

$aa = explode(',', $a) ;
$ab = explode(',', $b) ;

explode 関数によって "花子,はなこ,女,21" は array("花子", "はなこ", "女", "21") と言う配列に分解されます (explode が使える場合なら split よりこちらの方が速い)。


 return strcmp($aa[1], $ab[1]) ;

比較関数は大小を比較した結果として正か負の値か、$a, $b が等しい場合はゼロを返します。

ここでは文字列比較関数 strcmp にその判定をさせています。

($aa[1] と $ab[1] にはそれぞれ "はなこ"、"たろう" が入っている)


usort は cmp_furigana の返り値をもとにソートを行います。


http://php.manual.php.to/function.strcmp.html

  • id:akide
    リアクションが遅くなり大変失礼致しました。

    ご回答ありがとうございます。

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

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

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

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