2013-08-12 85 views
3

我有問題可以通過php simpleXML獲取日期範圍。PHP SimpleXML獲取日期範圍

所以我的XML結構如下所示:

<events> 
    <event_data> 
     <id>1</id> 
     <startdate realdate="2013-08-06">1375740000</startdate> 
     <enddate realdate="2013-08-13">1376344800</enddate> 
    </event_data> 

    <event_data> 
     <id>2</id> 
     <startdate realdate="2013-08-10">1376085600</startdate> 
     <enddate realdate="2013-08-17">1376690400</enddate> 
    <event_data> 

    <event_data> 
     <id>3</id> 
     <startdate realdate="2013-08-17">1376690400</startdate> 
     <enddate realdate="2013-08-24">1377295200</enddate> 
    </event_data> 

    <event_data> 
     <id>4</id> 
     <startdate realdate="2013-08-24">1377295200</startdate> 
     <enddate realdate="2013-09-07">1378504800</enddate> 
    <event_data> 

    <event_data> 
     <id>5</id> 
     <startdate realdate="2013-08-25">1377381600</startdate> 
     <enddate realdate="2013-09-08">1378591200</enddate> 
    </event_data> 

    <event_data> 
     <id>6</id> 
     <startdate realdate="2013-09-15">1379196000</startdate> 
     <enddate realdate="2013-09-23">1379887200</enddate> 
    <event_data> 

    <event_data> 
     <id>7</id> 
     <startdate realdate="2013-10-26">1382738400</startdate> 
      <enddate realdate="2013-11-02">1383346800</enddate> 
    </event_data> 

    <event_data> 
     <id>8</id> 
     <startdate realdate="2013-11-10">1384038000</startdate> 
     <enddate realdate="2013-11-15">1384470000</enddate> 
    <event_data> 

    <event_data> 
     <id>9</id> 
     <startdate realdate="2014-01-11">1389394800</startdate> 
     <enddate realdate="2014-01-18">1389999600</enddate> 
    </event_data> 

    <event_data> 
     <id>10</id> 
     <startdate realdate="2014-01-19">1390086000</startdate> 
     <enddate realdate="2014-01-24">1390518000</enddate> 
    <event_data> 
</events> 

和更多的條目類似,不同的開始日期和結束日期。

我的PHP腳本是這樣的:

<form action="" method="post"> 
    <div id="slider-range"></div> 
    <input type="text" name="startdate" style="margin:40px 0 0"> 
    <input type="text" name="enddate" style="margin:40px 0 0"> 

    <input type="submit" name="submitClub" value="Submit" /> 
</form> 

<?php 

?> 

<div id="eventList"> 
<?php 

    $sxe = simplexml_load_file('events.xml'); 

    if($sxe) { 
     if(isset($_POST['submitClub'])) { 

      $varStart = $_POST['startdate']; 
      $varEnd = $_POST['enddate']; 

      if($varStart) { 
       foreach($sxe->xpath('//event_data') as $item) { 
        $row = simplexml_load_string($item->asXML()); 

       $start = strtotime($varStart); 
       $end = strtotime($varEnd); 

       $v = $row->xpath('//startdate[. ="' . $start . '"]'); 
       $z = $row->xpath('//enddate[. ="' . $end . '"]'); 

       while($v <= $z){ 
?> 
        <div class="item <?php echo $item->categoryid ?> clearfix"> 
         <div class="left"> 
          <div class="header_data"> 
           <h2><?php echo $item->name ?></h2> 
           <div class="date"><?php 
            $startdate = $item->startdate->attributes()->realdate; 
             $enddate = $item->enddate->attributes()->realdate; 
             echo date("d.m.Y", strtotime($startdate)) . ' - ' . date("d.m.Y", strtotime($enddate)); 
            ?></div> 
            <div class="club"><?php echo $item->club ?></div> 
            <div class="theme"><?php echo $item->theme ?></div> 
           </div> 
          </div> 

         </div> 
<?php     $start = $start + 86400; 
         $v = $row->xpath('//startdate[. ="' . $start . '"]'); 
        } 
       } 
      } else { 
       echo 'Keine Events'; 
      } 
     }  
    } else { 
     echo '<p>Die Datei konnte nicht geöffnet werden</p>'; 
    } 
?> 
</div> 

因此,如果用戶在滑塊範圍選擇的開始日期爲2013年8月10日,併爲結束日期2013年9月12日的follwing事件應顯示:

<events> 
<event_data> 
    <id>1</id> 
    <startdate realdate="2013-08-06">1375740000</startdate> 
    <enddate realdate="2013-08-13">1376344800</enddate> 
</event_data> 

<event_data> 
    <id>2</id> 
    <startdate realdate="2013-08-10">1376085600</startdate> 
    <enddate realdate="2013-08-17">1376690400</enddate> 
<event_data> 

<event_data> 
    <id>3</id> 
    <startdate realdate="2013-08-17">1376690400</startdate> 
    <enddate realdate="2013-08-24">1377295200</enddate> 
</event_data> 

<event_data> 
    <id>4</id> 
    <startdate realdate="2013-08-24">1377295200</startdate> 
    <enddate realdate="2013-09-07">1378504800</enddate> 
<event_data> 

<event_data> 
    <id>5</id> 
    <startdate realdate="2013-08-25">1377381600</startdate> 
    <enddate realdate="2013-09-08">1378591200</enddate> 
</event_data> 

開始和結束日期是動態的,不是靜態的,所以用戶也可以選擇其他的開始和結束日期。

因此,如果用戶選擇2013年12月24日和2014年7月15日之間的日期範圍內的evenets應顯示:

<event_data> 
    <id>9</id> 
    <startdate realdate="2014-01-11">1389394800</startdate> 
    <enddate realdate="2014-01-18">1389999600</enddate> 
</event_data> 

<event_data> 
    <id>10</id> 
    <startdate realdate="2014-01-19">1390086000</startdate> 
    <enddate realdate="2014-01-24">1390518000</enddate> 
<event_data> 

我希望這clarifys我需要什麼。

也許有人可以幫助或給我一個提示。

回答

1

這是一個有點棘手得到XPath的權利,但這個應該這樣做:

$events = simplexml_load_file('events.xml'); 

$xpath = sprintf(
    '/events/event_data[ 
     (%1$d >= startdate and %2$d <= enddate) 
     or 
     (%1$d <= enddate and %2$d >= startdate) 
    ]', 
    strtotime('December 24, 2013'), 
    strtotime('July 15, 2014') 
); 

var_dump($events->xpath($xpath)); 

這將選擇一個<event_data>元素時(用戶提供的開始日期是後或活動開始日期用戶提供的結束日期之前或在事件結束日期)(用戶提供的結束日期之前或在結束日期的開始日期是上或事件開始日期之後)

演示:http://eval.in/42811http://eval.in/42812

+1

戈登感謝您的幫助,我真的很感謝你的努力來幫助我:) – kathi

+0

我有一個問題。如果我想顯示在給定日期範圍內開始的所有事件,那麼我該怎麼做? 我已經試圖使它與while循環一起工作,但那並不成功。 – kathi

+0

@kathi只是查詢任何event_data,其中link/startdate位於用戶提供的開始日期和結束日期之間。如果這不適合你,請考慮爲它創建一個新問題。 – Gordon