2013-04-18 11 views
6

Olay tarihleri ​​ile ilgili garip bir sorunum var ve bunu düzeltmek için çok uğraştım ama yapamıyorum.Tarih aralığı listesinde yedekli aylar ve yılların atlanması

ben sayfadaki tarihleri ​​görünmesini istediğiniz şekilde bir ekran bağlama am: Resimde enter image description here

Aktion ilk olay Deine Energie! her olayın başlangıç ​​tarihi ve bitiş tarihi olan 5 olayın birleşimidir.

Etkinliğin ilk bölümü, 4 Nisan'da başlayıp 4 Nisan'da sona eren 1 günlük bir etkinliktir. Benzer şekilde, ikinci bölüm 7 Nisan'da, 9 Nisan'da 3. kısım ve 4. bölümde 20 Nisan'da

Son bölüm 5 Mayıs'ta başlayıp 10 Mayıs'ta sona eriyor.

Tarihler bu biçimde veritabanında depolanır: Etkinliğin son kısmı için tarihleri ​​gösteriyorum. Etkinlik Başlangıç ​​Tarihi: 2013-05-05 00:00:00 Olay Sonu Tarihi: 2013-05-10 00:00:00

Bu nedenle, tarihleri ​​resimde gösterilen biçimde görüntülemek istiyorum.

Birden çok durum var: İlk olarak tüm tarihler tek bir ay içinde geliyorsa, ayın sonunda sadece bir kez görüntülenir. İkincisi, eğer aylar değişmişse ay adı, ayın değiştirildiği tarihten sonra gösterilecektir.

Olay tarihlerini bir süre içinde alıyorum, bu nedenle geçerli etkinlik tarihini gelecek olay tarihi ile bir döngüde nasıl karşılaştırırım.

Bu

birinden diğerine döngü değeri karşılaştırmak gerekir, çünkü sen mümkün olmayacaktır .. Eh

$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; 
    } 
} 

cevap

4

En kolay ilk örneğin içine sorgudan tüm verileri toplamak olacaktır dizi.

Yalnızca dizinin üzerine gelin. Tüm verilerin bir arada olması, her biri için yazdırmanız gereken ayrıntı düzeyini belirlemek için birbirini izleyen iki tarih aralığını karşılaştırmanıza olanak tanır.

Yorumlananlar örnek:

// 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 ", "; 
     } 
    } 
} 

Bu çıkışlar:

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

Ben bazı örnek kod ile benim cevap güncelledik. –

+1

Teşekkürler Martin. Bu benim için çalıştı. –

+0

Bir şey değil. Mutlu, sana yardım etti. –

0

ben veritabanından tarihleri ​​almak için şimdiye kadar kullanmış koddur doğrudan echo kullanın.

Geçici değişkenler kullanmanız gerekir. Başlangıç ​​tarihi için ilk döngü ile, $tmp_day_1 ve $tmp_month_1'u saklayın, ardından bitiş tarihi döngüsü ile her iki ayı karşılaştırabilir ve farklı olup olmadığını kontrol edebilirsiniz. Sonra echo'u kullanabilirsiniz. Sana sonraki öğeye kontrol etmek aslında mevcut tarih öğe için ay yazdırmak için gerekiyorsa bir olasılık kontrol etmek :)

1

benim noktayı umuyoruz. Beni pseudocode ile açıklamaya çalışalım:

<?php 

    $month = 0; // Initialize $month variable to unset 

    // Loop over all your events 
    foreach($dates as $date) { 

     // Convert $date to a timestamp 

     // If the 'month' of the current $timestamp is unequal to $month 
     // it means we switch months and we have to print the $month first 
     if(date('m', $timestamp) != $month) { 

      echo $month; // Of course format how you want it to be displayed 

      // Set $month to the new month 
      $month = date('m', $timestamp); 
     } 

     // Print the rest of the event, like day numbers here 

    } 
?>