[PHP-users 28810] Re: 難しいソートについて

junichi murayama jun-mura @ tozaisya.jp
2006年 3月 24日 (金) 14:16:56 JST


村山です。
 array_multisort関数を使った方が簡単だと思います。
 以下の書き方でどうでしょうか。
 参考
 http://jp.php.net/manual/ja/function.array-multisort.php
 例)
 // ファイルからログを読み込む。
 $data = array();
 $fp = fopen(ファイル名, "r");
 while (!feof($fp)) {
 $bf = fgets($fp, 1024);
 $aa = split("<>", $bf);
 $data[] = $aa;
 }
 fclose($fp);
 foreach ($data as $key => $zz) {
 // 1,2,3,0 の順では昇順に出来ないため0を一時的に置き換える。
 $key_level[$key] = $zz[1] != 0 ? $zz[1] : 9;
 $key_time[$key] = $zz[2];
 }
 array_multisort($key_level, SORT_ASC,
 $key_time, SORT_ASC,
 $data);
 テスト環境が無いでテストはしてません。
> はじめまして、ソートについてお聞きしたいことがあります。
>> 登録番号は0から始まる数字、レベルには「上:1 中:2 下:3 普:0」の値が入っています。
> *にはそのほかソートに関係のないデータがあります。
>> 登録番号<>レベル<>UNIXタイムスタンプ<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>\n
> このようなログを レベル>レベルが「普通」でUNIXタイムが新しいほうが上(上・中・下より下)に来るようにしたいのです
>>> 理想なソート結果
> 0<>1<>1111111111<>文字<>省略...
> 3<>2<>1111111114<>文字<>省略...
> 5<>2<>1111111116<>文字<>省略...
> 6<>3<>1111111117<>文字<>省略...
> 1<>0<>1111111112<>文字<>省略...
> 2<>0<>1111111113<>文字<>省略...
> 4<>0<>1111111115<>文字<>省略...
>> http://ns1.php.gr.jp/pipermail/php-users/2002-June/007909.html
> で参考にさせていただいたものを
>> function compare($a, $b) {
> $sa = split("<>", $a);
> $sb = split("<>", $b);
> if ($sa[1] == $sb[1]) return 0;
> return ($sa[1] > $sb[1]) ? -1 : 1;
> }
>> function log_sort($sdata){
> 	usort($sdata,compare);
> 	foreach($sdata as $key => $val){
> 		$new_data[]=$val;
> 	}
> 	return $new_data;
> }
>> $log_file="./data/log.dat";
>> $lines = file($log_file);
> $out_data = log_sort($lines);
>> $fp = fopen($log_file,"w");
> flock($fp,2);
> fputs($fp,$out_data);
> fclose($fp);
>> のように変えてもうまくいかず・・・
>> 良い案はございませんでしょうか?
>>>> PHP環境
> OS:Windows 2000 Pro Sp4
> Web:Apache2.0.5.4
> PHP:5.1.2
>>>> ------------------------------------------------------------------------
>> _______________________________________________
> PHP-users mailing list PHP-users @ php.gr.jp
> http://ns1.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://www.php.gr.jp/php/novice.php3



PHP-users メーリングリストの案内

AltStyle によって変換されたページ (->オリジナル) /