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

PHPについて質問です。
カンマで区切ったCSVデータをソートした上でweb上に表示したいと思っています。
ifを使い場所や定価を条件検索は作ることができました。行数も少ないうえ、レンタルサーバーがDBが使えないためPHPのみで。


しかし、それらの条件検索をかけた後に価格の安い順にソートしたいのですが、
その際どのようなPHP文章を書けばよいでしょうか。


店舗名,価格,定価(yen),場所(m)
電器店a,12000,20000,200
電器店b,10000,20000,300
電器店c,11000,20000,80
電器店d,15000,20000,100
電器店e,13000,20000,20


emeditorでプログラムをを書きxammpでテストし独自ドメインサイト(DB機能なし)にアップしています。
良回答者には500ポイント差し上げます。
よろしくお願いします。

●質問者: hanabusatsukasa
●カテゴリ:インターネット ウェブ制作
✍キーワード:CSV DB EmEditor PHP Web
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● Mook
●500ポイント

PHP の次の関数が参考になるでしょうか。

array_multisort


data.csv を

電器店a,12000,20000,200
電器店b,10000,20000,300
電器店c,11000,20000,80
電器店d,15000,20000,100
電器店e,13000,20000,20

とすると

<?
// CSV ファイルを読み込み、$data配列に格納
 $handle = fopen("data.csv", "r");
 while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) {
 $data[] = array( 'shop'=>$row[0] ,'priceA'=>$row[1], 'priceB'=>$row[2], 'place'=>$row[3] );
 }
 fclose($handle);

// 列方向の配列を得る
 foreach ($data as $key => $row) {
 $shop[$key] = $row['shop'];
 $priceA[$key] = $row['priceA'];
 $priceB[$key] = $row['priceB'];
 $place[$key] = $row['place'];
 }

// データを 価格の昇順にソートする
 array_multisort($priceA, SORT_ASC, $shop, SORT_DESC, $priceB, SORT_DESC, $place, SORT_DESC, $data);

// 結果の常時
 for( $i=0 ; $i<count( $data ) ; $i++ ) {
 print "$shop[$i] $priceA[$i] $priceB[$i] $place[$i]<br>\n";
 }
?>

で価格順にソートされます。

◎質問者からの返答

うまくいきました!

下記のような場合、ngの列は無視させokのみ表示させるにはどうすればいいでしょうか?

電器店a,12000,20000,200,ok

電器店b,10000,20000,300,ng

電器店c,11000,20000,80,ok

電器店d,15000,20000,100,ng

電器店e,13000,20000,20,ok


2 ● Mook
●0ポイント

条件を反映する方法は、何通りかやり方があると思いますが、ng のものを処理する必要がないのであれば、読み込みのときにはじいてしまうのが、手っ取り早いと思います。

<?
// CSV ファイルを読み込み、$data配列に格納
 $handle = fopen("data.csv", "r");
 while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) {
 if ( strcmp( $row[3], 'ok' ) == 0 ) {
 $data[] = array( 'shop'=>$row[0] ,'priceA'=>$row[1], 'priceB'=>$row[2], 'place'=>$row[3] );
 }
 }
 fclose($handle);

// 列方向の配列を得る
 foreach ($data as $key => $row) {
 $shop[$key] = $row['shop'];
 $priceA[$key] = $row['priceA'];
 $priceB[$key] = $row['priceB'];
 $place[$key] = $row['place'];
 }

// データを 価格の昇順にソートする
 array_multisort($priceA, SORT_ASC, $shop, SORT_DESC, $priceB, SORT_DESC, $place, SORT_DESC, $data);

// 結果の常時
 for( $i=0 ; $i<count( $data ) ; $i++ ) {
 print "$shop[$i] $priceA[$i] $priceB[$i] $place[$i]<br>\n";
 }
?>

のような感じでしょうか。

関連質問


●質問をもっと探す●



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