2013-04-18 9 views
6

私はイベントの日付で奇妙な問題を抱えています。日付範囲のリストに冗長な月と年を省略します

私はページ上の日付を表示する方法のスクリーンショットを添付しています:絵で enter image description here

アクション・中の最初のイベントDeineエネルギー・!開始日と終了日を持つ各イベントとの5つのイベントの組み合わせです。

イベントの最初の部分は、4月4日に始まり4月4日に終了する1日イベントです。同様に、第2部分は4月7日、第3部分は4月9日、第4部分は4月20日

最後の部分は5月5日に始まり、5月10日に終わります。

日付は、次の形式でデータベースに格納されます。 イベントの最後の部分の日付を表示しています。 イベント開始日:2013-05-05 00:00:00 イベント終了日:2013-05-10 00:00:00

このように、日付は図の形式で表示したいと考えています。

複数のケースがあります。 まず、すべての日付が1か月以内に来る場合は、末尾に月名を1回だけ表示します。 月が変更されると、月が変更された日の後に月の名前が表示されます。

私はイベントの日付をwhileループで取得していますので、現在のイベントの日付と来るべきイベントの日付をループで比較するにはどうすればいいですか?

これは私がデータベースから日付を取得するために、これまで使用してきたコード..です

$nid = $row->nid; 
$get_product_id = "SELECT product_id from {uc_product_kits} where nid='$nid'"; 
$res = db_query($get_product_id); 
while ($get_product_id_array_value = db_fetch_array($res)) { 
    $prductid = $get_product_id_array_value['product_id']; 
    $start_date = db_query("select event_start,event_end from {event} where nid=%d",$prductid); 
    $start_date_value = db_fetch_object($start_date); 
    $end_value = $start_date_value->event_start; 

    $event_end_date = $start_date_value->event_end; 
    $TotalStart = date("d M Y", strtotime($end_value)); 
    $TotalEnd = date("d M Y", strtotime($event_end_date)); 
    $onlyMonthStart = date("M", strtotime($end_value)); 
    $onlyMonthEnd = date("M", strtotime($event_end_date)); 
    //$groupMonth = db_query("select event_start,event_end, month from {event} where nid=%d group by ",$prductid); 
    if($TotalStart == $TotalEnd){ 
     $startDay = date("d", strtotime($end_value)); 
     $startMonth = date("M", strtotime($end_value)); 
     if(in_array($startMonth,$newMonth)) { 
      echo $onlstartdate; 
     } 
     else { 
       $onlstartdate = date("d", strtotime($end_value)); 
      echo $onlstartdate; 
      $tempStorage[] = $startMonth 
     } 
     //$newMonth[] = $startMonth; 
    } 
} 

答えて

4

最も簡単にクエリからのすべてのデータを収集します。アレイ。

その後、配列全体を反復処理します。すべてのデータをまとめておくと、連続した2つの日付範囲を比較して、それぞれに必要な詳細のレベルを決めることができます。

コメント例:

// collect data from SQL query into structure like this: 

$events = array(
    array("event_start" => "2013-4-4", "event_end" => "2013-4-4"), 
    array("event_start" => "2013-4-7", "event_end" => "2013-4-7"), 
    array("event_start" => "2013-4-9", "event_end" => "2013-4-9"), 
    array("event_start" => "2013-4-20", "event_end" => "2013-4-20"), 
    array("event_start" => "2013-5-5", "event_end" => "2013-5-10"), 
    array("event_start" => "2014-1-1", "event_end" => "2014-1-2"), 
); 

// the actual code for range list generation: 

for ($i = 0; $i < count($events); $i++) 
{ 
    // parse start and end of this range 
    $this_event = $events[$i]; 
    $this_start_date = strtotime($this_event["event_start"]); 
    $this_end_date = strtotime($this_event["event_end"]); 

    // extract months and years 
    $this_start_month = date("M", $this_start_date); 
    $this_end_month = date("M", $this_end_date); 
    $this_start_year = date("Y", $this_start_date); 
    $this_end_year = date("Y", $this_end_date); 

    $last = ($i == count($events) - 1); 
    // parse start and end of next range, if any 
    if (!$last) 
    { 
     $next_event = $events[$i + 1]; 
     $next_start_date = strtotime($next_event["event_start"]); 
     $next_end_date = strtotime($next_event["event_end"]); 

     $next_start_month = date("M", $next_start_date); 
     $next_end_month = date("M", $next_end_date); 
     $next_start_year = date("Y", $next_start_date); 
     $next_end_year = date("Y", $next_end_date); 
    } 

    // ranges with different starting and ending months always go 
    // on their own line 
    if (($this_start_month != $this_end_month) || 
     ($this_start_year != $this_end_year)) 
    { 
     echo date("j M", $this_start_date); 
     // print starting year only if it differs from ending year 
     if ($this_start_year != $this_end_year) 
     { 
      echo " ".date("Y", $this_start_date); 
     } 
     echo "-".date("j M Y", $this_end_year)." <br/>\n"; 
    } 
    else 
    { 
     // this is range starting and ending in the same month 

     echo date("j", $this_start_date); 
     // different starting and ending day 
     if ($this_start_date != $this_end_date) 
     { 
      echo "-".date("j", $this_end_date); 
     } 

     $newline = false; 
     // print month for the last range; 
     // and for any range that starts(=ends) in different month 
     // than the next range ends 
     if ($last || 
      ($this_start_month != $next_end_month)) 
     { 
      echo " ".date("M", $this_start_date); 
      $newline = true; 
     } 

     // print year for the last range; 
     // and for any range that starts(=ends) in different year 
     // than next range ends 
     if ($last || 
      ($this_start_year != $next_end_year) || 
      ($next_start_month != $next_end_month)) 
     { 
      echo " ".date("Y", $this_start_date); 
      $newline = true; 
     } 

     if ($newline) 
     { 
      echo " <br/>\n"; 
     } 
     else 
     { 
      // month (and year) will be printed for some future range 
      // on the same line 
      echo ", "; 
     } 
    } 
} 

この出力は:

4, 7, 9, 20 Apr <br/> 
5-10 May 2013 <br/> 
1-2 Jan 2014 <br/> 
+0

私はいくつかのサンプルコードで私の答えを更新しました。 –

+1

Martinに感謝します。それは私のために働いた。 –

+0

あなたは大歓迎です。ハッピー、それはあなたを助けました。 –

0

さて、あなたは別のループから値を比較する必要があるため、あなたがすることはできません直接echoを使用してください。

一時変数を使用する必要があります。したがって、開始日の最初のループでは、$tmp_day_1$tmp_month_1を保存し、終了日ループで両方の月を比較し、それらが異なるかどうかを確認することができます。その後、echoを使用できます。私は私のポイントを作る願っています:)

1

あなたは、現在の日付項目の月印刷する必要があるかどうかを確認する可能性が項目にチェックするために実際にあります。擬似コードで説明しようとしましょう:

関連する問題