2011-05-11 69 views
3

我使用PHP從XML文件輸出數據。這是違約的時間順序,我想要扭轉。這可能與PHP?如果是這樣,怎麼樣?使用PHP的XML逆序排序

這裏是我的page和代碼:

$file = 'http://www.gostanford.com/data/xml/events/m-baskbl/2010/index.xml'; 
    $xml = simplexml_load_file($file); 

     foreach ($xml as $event_date) { 
     if(!empty($event_date->event['vn']) && !empty($event_date->event['hn']) && !empty($event_date->event['vs']) && !empty($event_date->event['hs'])) 
     { 
      echo '<li>'; 
       echo '<h3>', $event_date->event['vn'], ' vs ', $event_date->event['hn'], '</h3>'; 
       echo '<p><strong>', $event_date->event['vs'], ' - ', $event_date->event['hs'], '</strong></p>'; 
       echo '<p>', date('F j, Y', strtotime($event_date['date'])), '</p>'; 
      echo '</li>'; 
     } 
    } 

感謝您的幫助!

回答

6

作爲第一個答案音符,這可能不是在大的XML文檔是個好主意。用於PHP 5.1.2及以上版本的最簡單和最便攜的代碼可能是使用SimpleXML。它可能已經內置到早期的PHP版本中,但它在5.1.2之後是標準的。

<?php 

$file = 'http://www.gostanford.com/data/xml/events/m-baskbl/2010/index.xml'; 
$xml = simplexml_load_file($file); 

if ($xml === false) { 
    echo "Couldn't load file\n"; 
    exit (1); 
} 

$xmlArray = array(); 

foreach ($xml as $event_date) $xmlArray[] = $event_date; 

$xmlArray = array_reverse($xmlArray); 

foreach ($xmlArray as $event_date) { 
    if(!empty($event_date->event['vn']) && !empty($event_date->event['hn']) && !empty($event_date->event['vs']) && !empty($event_date->event['hs'])) 
    { 
      echo '<li>'; 
       echo '<h3>', $event_date->event['vn'], ' vs ', $event_date->event['hn'], '</h3>'; 
       echo '<p><strong>', $event_date->event['vs'], ' - ', $event_date->event['hs'], '</strong></p>'; 
       echo '<p>', $event_date['date'], '</p>'; 
       echo '<p>', $event_date->event['local_time'], '</p>'; 
      echo '</li>'; 
    } 
} 


?> 
+0

@Erik Nedwidek - 謝謝,是的,我正在使用* simplexml_load_file *與外部XML文件並更新我的問題以表明這一點。我似乎無法讓你的代碼工作 - 我是否需要改變* simplexml_load_file *來使用* simplexmlelement *來代替? – Ryan 2011-05-11 21:26:10

+0

@Ryan - 你不需要對simplexml_load_file做任何事情。如果它成功加載xml文件,它將返回一個SimpleXMLElement對象(失敗時爲false)。在第二個foreach中,$ xml需要是$ xmlArray。 (修復了原始的答案) – 2011-05-11 21:40:29

+0

@Erik Nedwidek當我嘗試更新的答案時,我得到這個:致命錯誤:帶'message'字符串不能被解析爲XML的未捕獲異常'異常'。任何想法我做錯了什麼?謝謝。 – Ryan 2011-05-11 21:51:10

1

顯然,你可以將你的xml讀取到一個數組中並以相反的順序打印。但是,對於長長的列表來說,這可能不是一個好主意。

編輯:

foreach($xml as $event_date){ 
    if(!empty($event_date->event['vn']) && !empty($event_date->event['hn']) && !empty($event_date->event['vs']) && !empty($event_date->event['hs'])) 
    { 
     $my[]=array (
      "vn" => $event_date->event['vn'], 
      "hn" => $event_date->event['hn'] 
      ... 
     ); 
    } 
} 

for($i=count($my)-1;$i>=0;$i--) { 
    echo '<li>'; 
     echo '<h3>', $my[$i]['vn'], ' vs ', $my[$i]['hn']; 
     ... 
    echo '</li>'; 
} 

希望這會有所幫助,但可能需要修正。

+0

我該怎麼做?名單不那麼長 - 可能最多200-300行。 – Ryan 2011-05-11 19:50:38

+0

這似乎不適合我。我需要它按照倒序的順序出現。你知道如何得到這個工作嗎? – Ryan 2011-05-11 22:13:09

+0

對於遲到的回覆感到抱歉,您可以按照您的要求對數組進行排序。 – 2011-05-17 13:48:53

1

如果$xml只是一個數組,你可以使用array_reverse($xml)扭轉這種局面:

foreach (array_reverse($xml) as $event_date) { 
    // etc 
} 

但是,如果它的長,這可能不是有效的。你可以使用for循環手動與遞減指數:

for ($i = sizeof($xml) - 1; $i >= 0; --$i) { 
    // use $xml[$i] to access each element 
} 
+0

感謝您的回覆。不幸的是,這會產生這樣的錯誤:Warning:array_reverse()[function.array-reverse]:參數應該是第14行的數組 – Ryan 2011-05-11 19:50:03

+1

xml對象實際上不是一個數組。它實現了Traversable,因此它可以在foreach中使用,但不能作爲數組處理。 – 2011-05-11 19:58:47

1

你可以反轉你的輸出而不是xml嗎? IE:

$arr = array(); 
    foreach($xml as $event_date){ 
     if(!empty($event_date->event['vn']) && !empty($event_date->event['hn']) && !empty($event_date->event['vs']) && !empty($event_date->event['hs'])) 
     { 
     $strLine = ""; 
     $strLine .= '<li>'; 
     $strLine .= '<h3>'. $event_date->event['vn']. ' vs '. $event_date->event['hn']. '</h3>'; 
     $strLine .= '<p><strong>'. $event_date->event['vs']. ' - '. $event_date->event['hs']. '</strong></p>'; 
     $strLine .= '<p>'. $event_date['date']. '</p>'; 
     $strLine .= '<p>'. $event_date->event['local_time']. '</p>'; 
     $strLine .= '</li>'; 
     $arr[] = $strLine; 
     } 
    } 
    $arr = array_reverse($arr); 
    foreach ($arr as $line) 
    { 
     echo $line; 
    } 
+0

謝謝,但在你的例子中有幾個語法錯誤,我不知道如何糾正。你能編輯你的代碼嗎? – Ryan 2011-05-11 21:30:35

+0

@Ryan對不起。仍然在JavaScript模式下使用「var。」除此之外,所有事情都會在我的IDE上檢查出來有沒有一個特定的錯誤? – 2011-05-11 22:20:21

+0

在Dreamweaver裏面的四個strLine被標記爲不正確。當我上傳你的代碼時,我得到這個錯誤:解析錯誤:語法錯誤,意外','第19行 – Ryan 2011-05-11 22:24:46