0

Google カレンダーからイベントをインポートし、解析して別の場所に表示しています。さまざまな日付にまたがるイベントに行き詰まっています。例えば:

イベント 1
日付: 2013 年 4 月 29 日 - 2013 年 5 月 3 日

イベント 2
日付: 2013 年 5 月 1 日 - 2013 年 5 月 3 日

イベント 3
日付: 2013 年 5 月 3 日 - 2013 年 5 月 6 日

2013 年 5 月 3 日のイベントを表示する場合、イベント 1、2、3 を表示する必要があります。
これまでの私の計画は、イベントの開始日から終了日までのすべての日付を含む DatePeriod を生成し、日付のキーの下にイベント情報を追加して繰り返し処理することでした。つまり、それぞれにイベントの配列を含む日付の配列があります。
これは私がこれまでに持っているものです。私は正しい道を進んでいると思いますが、助けていただければ幸いです。ありがとう。

public function groupEvents()
            {
                foreach($this->events as $event)
                {
                    // Date is in the format of "Mon Apr 29, 2013 to Wed May 1, 2013".
                    if(preg_match_all("/\w{3} \w{3} \d{0,2}. \d{4}/", $event->getDate(), $matches))
                    {
                        // If there is more than one match then the event spans multiple days.
                        if(count($matches[0] > 1))
                        {
                            // Following line grabs the first date in the format of "Apr 29 2013"
                            $bDate = substr($matches[0][0],4,6) . substr($matches[0][0],11);
                            // Following line grabs the last date in the format of "May 1,2013"
                            $eDate = substr($matches[0][1],4,6) . substr($matches[0][1],11);
                            // Create a new DateTime based on the beginning date
                            $begin = new DateTime($bDate);
                            // Create a new DateTime based on the ending date
                            $end = new DateTime($eDate);
                            // Interval of 1 day.
                            $interval = new DateInterval('P1D');
                            // Create a DatePeriod of all dates between the beginning and end dates
                            $period = new DatePeriod($begin,$interval,$end);


                            foreach($period as $d)
                            {
                                // Problems start...
                                $this->newList[$d] = array($d => $newEvent);
                            }
                        }
                    }
                }
            }
4

2 に答える 2

0

私がアプローチする方法は、最初に Calendar テキストを配列に解析することです。簡単にするために、Event各イベントを整理して関連情報を格納するクラスを宣言します。Eventのようなクラス内でメソッドを宣言します。このメソッドis_activeは、DateTime引数を唯一のパラメーターとして取り、日付がイベントの開始日/終了日内にあるかどうかに応じてtrueorを返します。falseそこから、必要に応じて、すべてのイベントの既存の配列を特定の日付のサブセットにフィルター処理するのは非常に簡単です。

次のようなものから始める必要があります。

class Event {
    // instance variables.
    private $_name;
    private $_begin;
    private $_end;

    // retrieve the name of the current Event instance.
    public function name() { return $this->_name; }

    // build a new immutable Event instance
    public function __construct($name, $begin, $end) {
        $this->_name = $name;
        $this->_begin = $begin;
        $this->_end = $end;
    }

    // check whether the $date argument falls between this Event's start/end dates.
    // $date is assumed to be a valid DateTime object
    public function is_active($date) {
        return $date >= $this->_begin && $date <= $this->_end;
    }
}

さて、さらにOOP設計を続けるために、一連のイベントを管理するためのクラスも作成しますCalendar。この場合に使用します。ファイルからカレンダーを解析するための静的メソッドも追加しました。

class Calendar {
    // Regular Expression for parsing the date range of an event. Update this if the format changes.
    // currently it assumes strings like: "Date: mm/dd/YYYY - mm/dd/YYYY"
    const PREG_DATE = '~^Date:\\s*(\\d{1,2}/\\d{1,2}/\\d{2,4})\\s*-\\s*(\\d{1,2}/\\d{1,2}/\\d{4})~i';
    // for date_create_from_format, matches the above Regular Expressions assumptions about date ordering
    const DATE_FORMAT = 'm/d/Y';

    // hold onto all the events
    private $_events;

    public function __construct($evts) {
        $this->_events = $evts;
    }

    // Retrieve all events active on a certain date.
    // $date is assumed to be a valid DateTime object
    public function get_events($date) {
        // If using PHP less than 5.3, you'll need to rewrite this without using closures.
        // basically just filters the array according to the results of calling "is_active" on each
        // of the event objects.
        return array_filter($this->_events, function($obj) use($date) {
            return $obj->is_active($date);
        });
    }

    // Very simple parsing function to read a Calendar from file
    // fairly rigid formatting expected.
    //
    // Event Name
    // Date: formatted date <-- must be on the very next line
    // <any number of blank lines can follow the above name/dates pair>
    // ...
    public static function from_file($filepath) {
        $events = null;
        $fs = fopen($filepath, 'r');

        if ($fs !== false) {
            $events = array();
            while (($buffer = fgets($fs)) !== false) {
                $buffer = trim($buffer);
                if ($buffer !== "") { // skip empty lines
                    if (($dateString = fgets($fs)) === false || preg_match(self::PREG_DATE, $dateString, $matches) !== 1) { 
                        break; // Invalid format reached (either premature EOF or unrecognized date format
                    } 

                    // Create a new Event object and add it to the array with the parsed values.
                    $events[] = new Event(
                        $buffer, 
                        date_create_from_format(self::DATE_FORMAT, $matches[1]),
                        date_create_from_format(self::DATE_FORMAT, $matches[2])
                    );
                }
            }
            fclose($fs);
        }

        return $events !== null ? new Calendar($events) : null;
    }
}

そのように簡単です。Calendar は一連のEventオブジェクトを制御します。を呼び出すget_eventsと、特定の日にアクティブなすべてのイベントの配列を取得できます。例えば:

$calendar = Calendar::from_file('foo.txt');
var_dump($calendar->get_events(date_create_from_format('m/d/Y', '5/03/2013')));
于 2013-04-29T17:23:42.743 に答える
0

これにより、イベントがループされ、一致するイベントがエコーされます (配列を作成する必要があります)。

function groupEvents($mydate='2013-03-05')
{
    foreach($this->events as $event)
    {
        // Date is in the format of "Mon Apr 29, 2013 to Wed May 1, 2013".
        $event_date=$event->getDate();
        // check if TO exists in the event date
        if(stristr($event_date, ' to '))
        {
            $twodates=explode(" to ", $event_date);
            $start_date=strtotime($twodates[0]);
            $end_date=strtotime($twodates[1]);

            if( (date("Y-m-d", $start_date)<=$mydate) && ($mydate<=date("Y-m-d", $end_date)) )
            {
                // assuming $event->getName() will get the name of the event
                echo 'Event '.$event->getName().' '.date("m/d/Y", $start_date).' to '.date("m/d/Y", $start_date);
            }
        }
        else
        {
            $start_date=strtotime($event_date);

            if(date("Y-m-d", $start_date)==$mydate)
            {
                // assuming $event->getName() will get the name of the event
                echo 'Event '.$event->getName().' '.date("m/d/Y", $start_date);
            }
        }
    }
}
于 2013-04-29T17:20:24.040 に答える