[英]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.