PHP循环遍历XML文件,放入数组,然后排序

时间:2014-01-25 18:19:48

标签: php xml sorting

我有一个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);

它似乎没有按预期工作。难道我做错了什么?我假设它在排序部分

1 个答案:

答案 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);