如何排序具有字符串加上日期加数字的文件名

时间:2014-04-01 12:23:32

标签: php string sorting date numbers

我编写了一个脚本来获取给定目录中的所有文件并将这些文件上传到我的站点。但是,我遇到了一个问题 - 当我打印目录的文件名时,如下所示。

Products010420141400170007.xml

Products010420141402380008.xml

Products010420141406240009.xml

Products100320141739560000.xml

Products180320142116150001.xml

Products180320142121210002.xml

Products210320141150070003.xml

Products240320141643400004.xml

Products310320141848450005.xml

但我需要他们根据日期和最后的数字进行排序。文件名格式为

"Productsddmmyyhis0001.xml"

Products100320141739560000.xml
Products180320142116150001.xml
Products180320142121210002.xml
Products210320141150070003.xml
Products240320141643400004.xml
Products310320141848450005.xml
Products010420141400170007.xml
Products010420141402380008.xml
Products010420141406240009.xml

我怎样才能做到这一点?

感谢您的回答。

解决就像这样。你能告诉我未来好吗,目前工作正常。

$files = ftp_nlist($conn_id, ".");      

        foreach($files as $file)
        {
            $length =   strlen($file);
            $key    =   substr($file,22,($length-22));

            $final_array[$key]  = $file;    

        }
        ksort($final_array);

3 个答案:

答案 0 :(得分:3)

虽然可以使用正则表达式进行解析,但在您的情况下,使用substr()

会更好
$files = [
'Products010420141400170007.xml',
'Products010420141402380008.xml',
'Products010420141406240009.xml',
'Products100320141739560000.xml',
'Products180320142116150001.xml',
'Products180320142121210002.xml',
'Products210320141150070003.xml',
'Products240320141643400004.xml',
'Products310320141848450005.xml'
];

$f = function($z, $offset)
{
   return strtotime(
      sprintf(
         '%s.%s.%s %s:%s:%s',
         substr($z, $offset,    2),
         substr($z, $offset+2,  2),
         substr($z, $offset+6,  4),
         substr($z, $offset+10, 2),
         substr($z, $offset+12, 2),
         substr($z, $offset+14, 2)
      )
   );
};

usort($files, function($x, $y) use ($f)
{
   $dx = $f($x, 8);
   $dy = $f($y, 8);
   if($dx==$dy)
   {
      return substr($x, 22, 4)-substr($y, 22, 4);
   }
   return $dx-$dy;
});

-since substr()将更快地运行。请注意,上面的代码绑定到文件名结构,如果存在无效条目,则会失败。

它将解析文件名和提取日期&带偏移的时间部分然后,如果相应的时间戳相等,则比较数字(4位)后缀。

答案 1 :(得分:0)

如果文件格式为:"产品{ddmmyyyyhhmmss} XXXX.xml"

你应该尝试:

$all = [...]; // array of string with every files names;

$files = array();

foreach($all as $name) {
    $year= substr($name,12,4);
    $month = substr($name,10,2);
    $day = substr($name,8,2);
    $hour = substr($name,16,2);
    $min = substr($name,18,2);
    $sec = substr($name,20,2);
    $key = mktime($hour,$min,$sec,$month,$day,$year);
    // you got your timestamp

    $files[$key] = $name;
}

foreach($files as $name) {
    echo $name;
}

它应该显示从最旧到最新的文件。 但是你有一种排序的数组。如果你想要经典钥匙:

// instead of the last foreach :
$all = array();
foreach($files as $name) {
    $all[] = $name;
}

// for reversed array : (recent first)
array_reverse($all);

答案 2 :(得分:0)

我创建了以下函数来对文件名进行排序:

根据要求,filename的格式为:Productsddmmyyhis100000000.xml

因此,以下函数将分别根据年,月,日和文件编号对文件名进行排序。

// Main funcion to sort filenames
function sort_files($files)
{
    $temp_array = array();
    foreach ($files as $file)
    {
        $key = substr($file, 12, 4) . substr($file, 10, 2) . substr($file, 8, 2) . substr($file, 16);
        $temp_array[$key] = $file;
    }
    ksort($temp_array);

    return $temp_array;
}
$files = array(
    "Products010420141400170007.xml",
    "Products010420141402380008.xml",
    "Products010420141406240009.xml",
    "Products100320141739560000.xml",
    "Products180320142116150001.xml",
    "Products180320142121210002.xml",
    "Products210320141150070003.xml",
    "Products240320141643400004.xml",
    "Products310320141848450005.xml"
);
$sorted_files = sort_files($files);
echo "<pre>" . print_r($sorted_files, TRUE) . "</pre>";