2013-04-18 3 views
6

У меня странная проблема с датами событий, и я постарался ее исправить, но не смог этого сделать.Опуская лишние месяцы и годы в списке диапазонов дат

Я прилагаю скриншот того, как я хочу, чтобы отобразить даты на странице: enter image description here

В картине первое событие Deine Energie в Aktion! представляет собой комбинацию из 5 событий с каждым событием, имеющим дату начала и дату окончания.

Первая часть мероприятия - однодневное мероприятие, которое начинается 4 апреля и заканчивается 4 апреля. Аналогичным образом вторая часть находится 7 апреля, 3-я часть 9 апреля и 4-я часть 20 апреля

Последняя часть начинается 5 мая и заканчивается 10 мая.

Даты хранятся в базе данных в следующем формате: Я показываю даты для последней части события. Дата начала мероприятия: 2013-05-05 00:00:00 Дата окончания действия: 2013-05-10 00:00:00

Поэтому я хочу отображать даты в формате, показанном на картинке.

Существует несколько случаев: Прежде всего, если все даты будут входить в течение одного месяца, мы будем отображать имя месяца в конце только один раз. Во-вторых, если месяцы будут изменены, то имя месяца будет показано после даты изменения месяца.

Я получаю даты событий в цикле 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

Самый простой будет первым собрать все данные из вашего запроса в, например, массив.

Только после этого перейдите по массиву. Наличие всех данных позволит вам сравнить два последовательных диапазона дат, чтобы определить уровень деталей, который нужно распечатать для каждого.

комментируемые пример:

// 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

Спасибо Мартину. Это сработало для меня. –

+0

Добро пожаловать. Счастлив, это помогло тебе. –

0

Ну, так как вам нужно сравнить значение из одного цикла к другому, вы не сможете используйте echo напрямую.

Вам необходимо использовать временные переменные. Итак, с первым циклом для даты начала, вы храните $tmp_day_1 и $tmp_month_1, затем с циклом окончания даты вы можете сравнить оба месяца и проверить, отличаются ли они. Затем вы можете использовать echo. Я надеюсь, что я делаю свою точку :)

1

Возможность проверить, если вам нужно напечатать месяц для текущего элемента даты фактически проверить в следующего пункта. Позвольте мне объяснить с псевдокоде:

<?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 

    } 
?> 
Смежные вопросы