[PHP-users 12608] Re: csvデータの配列ソートについてお願いします。

R_Yamaguchi php-users@php.gr.jp
Sat, 18 Jan 2003 13:13:01 +0900


しょうなりさん、Gustavさんに頂いた意見を参考にしたのですが、自分なりに下のよ
うにやったのですが、うまくいきませんでした。

これを、どのような使い方をするかというと、例えば予めIDを振ったダイレクトメー
ルを出したとします。回答のあったものをIDの順番に関係なくCSVファイルにフォー
ムから打ち込んで行きます。”ID,NAME,ADDR+改行”の形でファイルは出来上がって
いきますが、これを保存する際に新しくデータを追加したときに、打ち込んだ順番で
はなく、ID順に並べ替えてCSVに保存したいのです。
データソート関数の組み方がおかしいのか、根本的に配列の組み方がおかしいのか、
現状以下のコードでは、仮出力部分でデータがソートされないのはおろか、”
NAME,ADDR,ID”の順番(0,1,2 >> 1,2,0)になってしまいました。

<?php
/****このファイルでしたい行程

1.FORMからのデータ受信($formdata)
2.$formdataをCSVデータに書込
3.CSVファイルの読込
4.結合したデータを連想配列に書直し
5.キー'id'でソートしたものを仮表示
6.ソートした連想配列をCSVに書直し
7.書直したデータをCSVファイルに上書き
以上
*/
/****データを"id"でソートする関数*/
function sort_by_id($p1, $p2) {
    if ($p1['id'] == $p2['id']) return 0;
    return ($p1['id'] > $p2['id']) ? -1 : 1;
}

/****フォームからのデータをCSVファイルに書込 (行程1. 2.)*/
$fp = fopen("lnk.csv", "a");
 flock($fp, LOCK_EX);
 file://fputs($fp, implode(",", $formdata) . "\n");
 flock($fp, LOCK_UN);
fclose($fp);

/****CSVファイルのデータを読込 (行程3. 4.)*/
$fp = fopen("lnk.csv", "r");
 flock($fp, LOCK_EX);
 while($line_array = fgetcsv($fp, 1024)):
/****ID順にソートしたものを仮表示 (行程5.)*/
      usort($line_array, 'sort_by_id');
      echo "<table border=\"1\"><TR>";
      foreach ($line_array as $key => $value):
           $tmp = array(
                "id"  => $id,
                "name" => $name,
                "addr" => $addr,
           );
           $line_array[] = $tmp;
           echo "<td width=\"200\">". $value . "</td>\n";
      endforeach;
      echo "</TD></TR></TABLE>";
 endwhile;
 flock($fp, LOCK_UN);
fclose($fp);

/****(行程6.)*/
/****(行程7.)*/

?>