我有一个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);
它似乎没有按预期工作。难道我做错了什么?我假设它在排序部分
答案 0 :(得分:1)
您在这里以错误的方式致电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);