PHP Parse проходит через # дней, но хочет ограничить количество выводов - PullRequest
0 голосов
/ 20 января 2012

Итак, я использую следующий длинный фрагмент кода для отображения предстоящих событий.Он запрашивает количество дней, в течение которых вы хотите отобразить события, скажем, 10 дней, и группирует столько событий за эти 10 дней.Я изменил код, чтобы не было только одного заголовка для данной даты с несколькими событиями под ним, вместо того, чтобы отображалась каждая дата события.Однако это все еще дает мне все события следующих 10 дней.Я хотел бы ограничить код так, чтобы из многочисленных событий следующих 10 дней он только возвращал / отображал / выводил 6 событий.

Я почти уверен, что мне нужно изменить здесь: for ($i=0; $i<$days_to_display; $i++)но бит $days_to_display усложняет задачу.

Любая помощь будет принята с благодарностью!

<code> <?php

// List View of Coming Events v .9
// Plug-in for PHPiCalendar 2.0 / 2.1
// developed by Johnathon Wright (my initials @ mustmodify.com)

// Original Publication Date: 2005 10 28
// Originally Developed for St. Barnabas Episcopal Church website

// Include this file from your PHP-enabled front page.
// Do something like this:
// <?PHP include 'd:/inetpub/.../phpical/event_list.php'; 

// DEFINE the base PHPiCalendar directory below.
define('BASE', 'c:/inetpub/ouhsd.k12.ca.us/phpicalendar/');

// create an actual PHPiCalendar instance
require_once(BASE.'functions/ical_parser.php');
require_once(BASE.'functions/list_functions.php');
require_once(BASE.'functions/template.php');
header("Content-Type: text/html; charset=$charset");

// at this point, the calendar has been generated and its data
// is stored in $master_array. Test to ensure that this is working by
// un-commenting the lines below.

/*
echo "<pre>";
print_r($master_array);
echo "
"; * / // Несколько настроек ... // days_to_display_default должно быть положительным целым числом.$ days_to_display_default = 14; // ПОКАЗАТЬ ЧАСТНЫЕ СОБЫТИЯ {TRUE, FALSE} // В Mozilla Sunbird события могут быть установлены в PRIVATE. // PHPiCalendar не отображает заголовок или описание // этих событий, но отображает время,если применимо. // Если вы хотите скрыть эти события, установите $ show_private_events в FALSE. // В противном случае это должно быть TRUE $ show_private_events = TRUE; // day_to_begin должен быть текстовой строкой. Для полной документации см. http://www.php.net/strtotime //Некоторые значения, которые я тестировал: // ------------------------------------------------------- // последний понедельник - самый последний понедельник. // четверг - это дало мне дату следующего Мыdnesday.// вчера - вчера // сегодня - сегодня // на следующей неделе - +2 недели (как это может быть? Не спрашивайте меня, это PHP ...) // 1 неделя - неделя с сегодняшнего дня $ day_to_begin = "сегодня«;// Замените закомментированным кодом, если вы НЕ хотите, чтобы // пользователи могли устанавливать это значение самостоятельно.$ days_to_display = $ days_to_display_default;/ * // этот код заменяет приведенный выше код, если вы хотите запретить // пользователям устанавливать количество дней для отображения $ days_to_display = $ days_to_display_default;* / // Этот следующий раздел кажется ужасно неэффективным.// Мы вычисляем метку времени unix «первым делом сегодня утром», определяя дату //, а затем ищем метку времени для этой даты ... // Опять же, закомментированный код не позволяет пользователям устанавливать собственную дату начала.$ date_start = date ('Ymd', strtotime ("now"));$ timestamp_start = strtotime (dateOfWeek ($ getdate, $ date_start));/ * $ date_start = date ('Ymd', strtotime ("now"));$ timestamp_start = strtotime (dateOfWeek ($ getdate, $ date_start));* / // Показать диапазон дат для этого списка $ timestamp_end = $ timestamp_start + ($ days_to_display * 24 * 60 * 60);// заполнить итератор $ thisdate текущей меткой времени.// он будет проходить по циклу $ days_to_display ... $ thisdate = $ timestamp_start;// Цикл по дням, поиск событий в каждом дне для ($ i = 0; $ i <$ days_to_display; $ i ++) {$ thisday = date ("Ymd", $ thisdate);if (isset ($ master_array [$ thisday])) {echo ""; foreach ($ master_array [($ thisday)] as $ event_start_time => $ event_set) {foreach ($ event_set as $ event_id => $ event_info) {// где мы? // дата равна $ thisdate // время равно$ event_start_time // событие равно $ event_id; if (! (($ event_info ['event_text'] == '** PRIVATE **') && ($ show_private_events == FALSE))) {// заголовок события echo " "; echo" ". stripslashes (urldecode ($ event_info ['event_text']))." "; // Диапазон времени события, если не эхо-событие всего дня" ". date (" D. F jS ", $ thisdate)." "; if (! (($ event_info ['event_start'] == '0000 ') && ($ event_info [' event_end '] ==' 0000 '))) {echo ":". Date ("g: ia", $ event_info [' start_unixtime ']). "-". Date ("g: ia ", $ event_info ['end_unixtime'])."";} // местоположение события if (strlen ($ event_info ['location'])> 0) {echo "". полоски (urldecode ($ event_info ['location'])). ""; } / * if ((($ event_info ['event_start'] == '0000') && ($ event_info ['event_end'] == '0000'))) { эхо "весь день"; } * / // Описание события. echo ""; } // ЕСЛИ частное мероприятие И мы не хотим их видеть } // КОНЕЦ введите это событие } // КОНЕЦ событие foreach } // END, если сегодня есть какие-либо события в массиве // итератор должен быть на следующий день. // Почему это 25? Разве это не должно быть 24? $ thisdate = ($ thisdate + (25 * 60 * 60)); } ?>

Ответы [ 2 ]

0 голосов
/ 20 января 2012

Возможно, это не лучший способ!Но вы можете добавить еще один цикл for над foreach, например:

   for ($i=0; $i<$days_to_display; $i++) 
  {

      $thisday = date("Ymd", $thisdate);

      if (isset($master_array[$thisday])) 
   {
          echo "<br/>";

     for($k=0;$k<=$noofevents;$k++) //Where $noofevents is the number of events! 
    {
foreach($master_array[($thisday)] as $event_start_time => $event_set)
     {
     foreach ($event_set as $event_id => $event_info)
        {
        // Where are we?
        //    date is $thisdate
        //    time is $event_start_time
        //    event is $event_id;

        if (! (($event_info['event_text'] == '**PRIVATE**') && ($show_private_events == FALSE)))
           {
// event title
            echo "<li>";
           echo "<span class='bold_text'>" . stripslashes(urldecode($event_info['event_text'])) . "</span><br/>";


// event time range, if not an all-day event
           echo " <span style='display: block;'>". date("D. F jS", $thisdate) . "";

            if (! (($event_info['event_start'] == '0000') && ($event_info['event_end'] == '0000')))
                {
              echo ":
" . date("g:ia", $event_info['start_unixtime']) . " - " . date("g:ia", $event_info['end_unixtime'])."</span>";
              }

// event location
           if (strlen($event_info['location']) > 0)
              {
              echo " <span class='italic_text'>" . stripslashes(urldecode($event_info['location'])) . "</span>";
              }


            /*  
            if ( (($event_info['event_start'] == '0000') && ($event_info['event_end'] == '0000')))
                {
              echo "all day";
              }*/

           // event description.

            echo "</li>";
           } // IF private event AND we don't want to see those
        }// END enter this event
     } // END foreach event 
   }  // END for x events
  } //END if isset
 }//END for days
0 голосов
/ 20 января 2012

Установите где-нибудь счетчик, чтобы отслеживать, сколько событий было выведено, и завершите цикл, как только вы достигнете предела:

$limit = 6;
$displayed = 0;

foreach(...) {
   if (show_event()) {
      ... show event ...
      $displayed++;
      if ($displayed >= $limit) {
          break;
      }
   }
}
...