• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:重複を無くしたい)

データの重複を解消して一週間分のリストを表示する方法

このQ&Aのポイント
  • データベースから一週間分のリストを作成する際に、日付の重複を避ける方法を知りたいです。
  • 複数のデータを含む日付がある場合、次の日付に移動させる方法を教えてください。
  • 例えば、03/20にa1、a2、a3という複数のデータがある場合、03/20の後には03/21のデータが表示されるようにしたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • trisagion
  • ベストアンサー率68% (15/22)
回答No.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"); } 上のサンプルと同じ考え方ですが、文字を取得する変数を日付をキーとしたハッシュにして、日付が同じならカンマで新しい文字をつなげる方法です。

miya0726
質問者

お礼

お返事ありがとうございます。 ソースコード付きで助かります。 データベースは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さんのコードを参考にして 作り直したいと思います。 ありがとうございました。

関連するQ&A