[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.)*/
?>