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ポイント差し上げます。
よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2007/03/10 20:28:02
  • 終了:2007/03/16 23:01:07

回答(2件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912007/03/10 23:32:04

ポイント500pt

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";
   }
?>

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

id:hanabusatsukasa

うまくいきました!

下記のような場合、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

2007/03/11 18:14:41
id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912007/03/11 20:59:46

条件を反映する方法は、何通りかやり方があると思いますが、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";
   }
?>

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

  • id:Mook
    ok ng は$row[4] の項目でしたね。

    if ( strcmp( $row[3], 'ok' ) == 0 ) {

    if ( strcmp( $row[4], 'ok' ) == 0 ) {
    に修正してください。

    失礼しました。

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

トラックバック

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

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

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