2009-11-25 68 views
0

我已經開始使用simplexml函數,該函數看起來比我以前嘗試使用的其他解析器效果更好。我已經到了需要通過傳輸日期對物品 進行排序的階段 - 我嘗試使用uasort,但沒有對項目的順序進行任何更改。如何使用SimpleXML對XML提要進行排序

也有的時候一個程序在同一天不止一次 - 它會更容易排序通過videoID可以提供任何幫助嗎?

這個物體是什麼樣子:

[0] => SimpleXMLElement Object 
    (
     [VideoID] => 108059 
     [Genre] => Music 
     [ProgrammeName] => MTV 
     [OriginalAiringDate] => 2009-11-10T19:22:24 
     [TransmissionDate] => 2009-11-10T19:22:24 
    ) 
[1] => SimpleXMLElement Object 
    (
     [VideoID] => 108395 
     [ExpiryDate] => 2009-12-12T23:59:59 
     [DateCreated] => 2009-11-12T13:28:54 
     [Genre] => Music 
     [ProgrammeName] => MTV 
     [OriginalAiringDate] => 2009-11-12T19:22:32 
     [TransmissionDate] => 2009-11-12T19:22:32 
) 

$xml = simplexml_load_file("data.xml"); 
$count = 0; 
$sortItem = 0; 
$dateformat = "D j M, g:ia"; 
$sortArray = array(); 
foreach($xml->CatchUp as $item){ 
$sortArray[$count][TransmissionDate] = $item; 
if($count < 4){ 
print "<p>Programme Name:<strong> " . $item->ProgrammeName. "</strong></p>"; 
print "<p>Date Shown:<strong> " . date($dateformat, strtotime($item->TransmissionDate)). "</strong></p>"; 
print "<p>Description:<strong> " . trunc($item->ShortSynopsis,30, " ")."</strong></p>"; 
print "<p><a href='". $item->VideoID. "'>". $item->VideoID."</a></p>"; 
     $count++; 
    } 
} 

}

ASORT($ sortArray);

回答

1

我覺得那樣做有兩種方式。第一個是創建一個包含TransmissionDate值的數組,然後是包含相應節點的另一個數組,然後使用array_multisort()。這是一個有點乏味,所以這裏就是我想要做的,而不是:下載SimpleDOM和使用sortedXPath()

include 'SimpleDOM.php'; 

$xml = simpledom_load_file("data.xml"); 
$dateformat = "D j M, g:ia"; 

foreach($xml->sortedXPath('CatchUp[ProgrammeName="MTV"]', 'TransmissionDate') as $i => $item) 
{ 
    if ($i == 4) 
    { 
     // I assume you only want the first 4 
     break; 
    } 
    print "<p>Programme Name:<strong> " . $item->ProgrammeName. "</strong></p>"; 
    print "<p>Date Shown:<strong> " . date($dateformat, strtotime($item->TransmissionDate)). "</strong></p>"; 
    print "<p>Description:<strong> " . trunc($item->ShortSynopsis,30, " ")."</strong></p>"; 
    print "<p><a href='". $item->VideoID. "'>". $item->VideoID."</a></p>"; 
} 
+0

偉大的Josh它的工作原理,一個小問題,如果我想過濾的名稱,例如說只顯示前4 MTV節目只。 like if($ item-> Program ==「MTV」){}它似乎打破了 – NiseNise

+0

第一個參數是一個XPath表達式。 ''CatchUp'的意思是「所有子節點名爲'CatchUp'」 - 您可以添加一個謂詞,如:'CatchUp [ProgrammeName =「MTV」]'將其轉換爲名爲'CatchUp'的所有子節點都有一個名爲子節點'ProgrammeName',其值爲''MTV''「 - 請參閱http://www.w3schools.com/XPath/xpath_syntax.asp –

+0

談到XPath,我還應該提及您可以使用它來限制您的搜索到第一個通過添加謂詞'[position()<= 4]'來添加N個項目,從而不需要PHP中的計數器。我沒有提到它讓初學者變得簡單,但是任何需要操作XML的人都應該仔細看看XPath,因爲一旦你學會了基礎知識,它真的很強大,而且非常簡單。 –

0

嘗試使用視頻ID您的SimpleXMLElement對象

拉取數據時使用的鑄造:$sortArray[$count][VideoID] = (int)$item;

+0

很新的SimpleXML什麼是鑄造??? – NiseNise

+0

謝謝cedko80,它實際上沒有工作順序保持不變 foreach($xml->CatchUp as $item){ $sortArray[$count]['VideoID'] = (int)$item; \t if($count < 4){ .... \t \t $count++; \t } } asort($sortArray); NiseNise

相關問題