- ベストアンサー
データの重複を解消して一週間分のリストを表示する方法
- データベースから一週間分のリストを作成する際に、日付の重複を避ける方法を知りたいです。
- 複数のデータを含む日付がある場合、次の日付に移動させる方法を教えてください。
- 例えば、03/20にa1、a2、a3という複数のデータがある場合、03/20の後には03/21のデータが表示されるようにしたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
データベースが何を使ってるのか解らないので細かい所は説明出来ませんが、以下のような考え方で出来ると思います。 前提:データベースから日付と文字の二つのカラムを取得 データは日付でソートされた上で一行毎取得 [データベースがoracleでのサンプル] $day = array();//日付の配列 $data = array();//文字の配列 $old = "";//前のデータの日付を保存する変数 while(ocifetch($cursor)){//データを一行ずつ取得 $temporary = ociresult($cursor,1);//日付を一時変数に取得 if($old != $temporary){//日付が前の日付と違う場合 $days[] = $temporary;//日付を取得 $data[] = ociresult($cursor,2);//文字を取得 $old = $temporary;//取得した日付を前の日付として代入 } } for(i = 0; i < count($day); ++i){ print("| $day[$i] $data[$i] |\n"); } データを日付順にソート(場合によっては文字でもソート)した上で一行ずつ取得します。 日付を保存する変数$oldを準備しておき、新しく取得した日付が前のデータの日付と違えばデータを保存し、$oldを新しい日付にするというループです。(日付が同じなら何もしない) 一日にa1、a2、a3と複数のデータが入る場合に、すべての文字を取得しておく場合は以下のようになるでしょう。 $day = array(); $data = array(); $old = ""; while(ocifetch($cursor)){ $temporary = ociresult($cursor,1); if($oldtemporary != $temporary){ $day[] = $temporary; $data[$temporary] = ociresult($cursor,2); $old = $temporary; }else{//日付が同じ場合 $data[$temporary] = $data[temporary].",".ociresult($cursor,2);//取得した文字に続けてカンマで新しいデータをつなげる } for(i = 0; i < count($day); ++i){ print("| $day[$i] $data[$day[i]] |\n"); } 上のサンプルと同じ考え方ですが、文字を取得する変数を日付をキーとしたハッシュにして、日付が同じならカンマで新しい文字をつなげる方法です。
お礼
お返事ありがとうございます。 ソースコード付きで助かります。 データベースはpostgresを使っています。 DBテーブルに「週間表示」というフィールドを追加して 週間表示に1が入っていれば表示するようにしました DBに書くときに |日付 |データ|週間表示| |050321|a1 |1 | |050321|a2 | | |050321|a3 | | |050322|b1 |1 | |050323|c1 |1 | |050324|d1 |1 | |050324|d2 | | |050325|e1 |1 | |050326|f1 |1 | とし、週間表示で表示するか否かを判断してます。 trisagionさんのコードを参考にして 作り直したいと思います。 ありがとうございました。