簡體   English   中英

PHP遍歷XML文件,放入數組,然后排序

[英]PHP Loop through XML files, Put in Array, Then Sort

我有一個看起來像這樣的XML文件文件夾,都帶有不同的時間戳

<?xml version="1.0"?>
<comment>
  <timestamp>1390601221</timestamp>
</comment>

我正在使用glob函數將所有這些都放入數組中

$xmls = glob("xml/*.xml");

然后,我嘗試將時間戳記值和xml路徑放入新數組中,以便可以按時間戳記進行排序。 這就是我的做法。

$sorted_xmls = array();

        foreach ($xmls as $xml) {

            $raw_xml = file_get_contents($xml);

            $data = simplexml_load_string($raw_xml);

            $time = $data->timestamp;
            array_push($sorted_xmls, array($time, $xml));

        }

所有這些似乎都可以正常工作。 現在我想按時間戳排序。 以最新的為先。

foreach ($sorted_xmls as $key => $row) {
    $final_sorted[$key]  = $row[0];
}


array_multisort($final_sorted, SORT_ASC);

它似乎沒有按預期工作。 難道我做錯了什么? 我認為它在排序部分

您在此處以錯誤的方式調用array_multisort() 您需要調用它的方式如手冊頁中的示例3“對數據庫結果進行排序”。

這種方法的工作方式是:傳遞要排序的“列”,以及按順序對列進行排序的標志,然后將目標數組(實際上將要排序的數組)作為最后一個參數傳遞。

因此,如果將最后一行更改為:

array_multisort($final_sorted, SORT_ASC, $sorted_xmls);

...然后應按照您希望的方式對$sorted_xmls進行排序。

但是,一種更高效,盡管更復雜的方法可能是使用usort()直接對$xmls數組進行排序,並同時從磁盤加載文件。

$xmls = glob("xml/*.xml");

usort($xmls, function($a, $b) {
    // Temporary array to hold the loaded timestamps
    // Because this is declared static in a closure, it will be free'd when
    // the closure goes out of scope, i.e. when usort() returns
    // If you want to store the timestamps for use later, you can import a
    // reference to an external variable into the closure with a use() element
    static $timestamps = array();

    // Load XML from disk if not already loaded
    if (!isset($timestamps[$a])) {
        $timestamps[$a] = simplexml_load_file($a)->timestamp;
    }
    if (!isset($timestamps[$b])) {
        $timestamps[$b] = simplexml_load_file($b)->timestamp;
    }

    // Return values appropriate for sorting
    if ($timestamps[$a] == $timestamps[$b]) {
        return 0;
    }
    return $timestamps[$a] < $timestamps[$b] ? 1 : -1;
});

print_r($xmls);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM