2012-01-03 59 views
0

我有一堆數據存儲在一個XML文件中,我用PHP打印出列表。我希望用戶能夠選擇如何對列表進行排序。PHP usort()是否在DOM nodeLists上工作?

我用usort()嘗試了一下,但它似乎沒有工作。它不會拋出異常,所以我認爲它是可行的,但是我的排序功能有些不合適。我要做的第一件事就是讓數據通過它的創建日期進行排序 - 這是存儲在一個屬性是這樣的:

<root> 
    <info created="2011-12-31"> 
     <sometags /> 
    </info> 
    <info created="2012-01-02"> 
     <sometags /> 
    </info> 
    <info created="2012-01-01"> 
     <sometags /> 
    </info> 
</root> 

,我的排序與這個工作:

function sortByDate($a, $b) { 

    //get array of year, month and day 
    $adates = explode('-', $a->getAttribute('created')); 
    $bdates = explode('-', $b->getAttribute('created')); 

    //if the years are not the same, use them to sort 
    if ($adates[0] != $bdates[0]) { 
     return (intval($adates[0]) < intval($bdates[0])) ? -1 : 1; 
    } 
    //if the years are the same, try sorting by the months 
    else if ($adates[1] != $bdates[1]) { 
     return (intval($adates[1]) < intval($bdates[1])) ? -1 : 1; 
    } 
    //if the years and months are both the same, try sorting by days 
    else { 
     return (intval($adates[2]) < intval($bdates[2])) ? -1 : 1; 
    } 

    //if we get this far, the dates are identical 
    return 0; 
} 

,這是我怎麼稱呼它:

$xmlDoc = new DOMDocument(); 
$xmlDoc->load('data.xml'); 

$infotags = $xmlDoc->documentElement->getElementsByTagName('info'); 

usort($infotags, 'sortByDate'); 

是它的一些愚蠢的錯誤,我做了,或者我應該是別的完全做什麼?順便說一下,我知道上面的if... else結構實際上不會按正確的順序排列日期。我只是想讓它做 - 目前usort()只是以與開始時相同的順序離開節點列表。

+0

你問過之前檢查過任何http://stackoverflow.com/search?q=sort+xml+php嗎?如果是這樣,請指出爲什麼這些都不能回答你的問題。 – Gordon 2012-01-03 10:22:18

+0

唉,你說得對。我正在用「nodelist」進行搜索,這似乎濾除了很多相關的結果。 XSLT似乎是我應該去的方式。對不起,我會盡量在下次更有效地搜索。我應該刪除這個問題嗎? – 2012-01-03 12:28:44

+0

好吧,如果搜索結果回答你的問題,那麼是的,我會刪除它。不知道你是否可以用@Sjoerd給出答案。 – Gordon 2012-01-03 12:39:11

回答

0

getElementsByTagName返回一個DOMNodeList,它是一個Iterator而不是一個真正的數組。因此,您無法更改列表的順序。

嘗試先將其轉換爲數組。

+0

啊哈!謝謝,我會看看我能想出什麼。 – 2012-01-03 10:21:58