我正在使用PHP脚本,该脚本允许按时间顺序浏览Eggdrop生成的IRC日志。最初,我正在读取目录内容并根据文件修改日期将日志名称插入到数组中。然而,在最近的服务器移动之后,文件的修改日期已更新,导航现在已经无序!
日志文件名结构如下所示:
channel.log.dayMONTHyear.txt
例如:
shrawberry.log.08Apr2011.txt
由于人类可读性很高,很难正确订购。
由于月份代码总是三个字符长并且在序列中处于可预测的位置,我可以手动将非标准日期代码解析为Unix时间戳,遍历列表并将每个项目添加到具有该时间戳的数组中,然后按该数字对数组进行排序。
但这听起来过分了。
我是在赚钱,还是我提出的理想解决方案?
在Marc B.的帮助下,我实施了以下内容:
function dateFromEggLog($string){
$month = substr($string,-11,-8);
$day = substr($string,-13,-11);
$year = substr($string,-8,-4);
for($i=1;$i<=12;$i++){
if(strtolower(date("M", mktime(0, 0, 0, $i, 1, 0))) == strtolower($month)){
$month = $i;
break;
}
}
return "$year-$month-$day";
}
function my_compare($a, $b) {
$a_date = dateFromEggLog($a);
$b_date = dateFromEggLog($b);
if ($a_date == $b_date) {
return 0;
}
$a = strtotime($a_date); // convert to PHP timestamp
$b = strtotime($b_date); // convert to PHP timestamp
return (($a < $b) ? -1 : 1);
}
这成功地对我的日志进行了排序,而无需使用我的阵列。
答案 0 :(得分:3)
您的示例文件名与“看起来像”样本不匹配 - 'txt'和日期字符串相反。但无论如何,您可以使用PHP usort()
函数,它允许用户定义的函数进行比较。
它可能不是特别有效,但你会做这样的事情:
function my_compare($a, $b) {
$a_date = ... extract date field from filename in $a
$b_date = ... extract date field from filename in $b
if ($a_date == $b_date) {
return 0;
}
$a = strtotime($a_date); // convert to PHP timestamp
$b = strtotime($b_date); // convert to PHP timestamp
return (($a < $b) ? -1 : 1);
}
usort($array_of_filenames, 'my_compare');
答案 1 :(得分:0)
您之前使用过filemtime吗?为什么不立即使用filectime?
答案 2 :(得分:0)
为什么不在排序函数中使用字符串操作将channel.log.dayMONTHyear.txt
重新排序为channel.log.yyyymmdd.txt
,然后使用基本字符串比较?
<?php
/* Helper stuff */
$months = Array(
"Jan" => "01", "Feb" => "02", "Mar" => "03",
"Apr" => "04", "May" => "05", "Jun" => "06",
"Jul" => "07", "Aug" => "08", "Sep" => "09",
"Oct" => "10", "Nov" => "11", "Dec" => "12"
);
/* The hard work */
function convertLogFilename($file) {
$pos = strpos($file, ".log.");
if ($pos === FALSE)
throw new Exception("Invalid log file format");
$pos += strlen(".log.");
$dd = substr($file, $pos, 2);
$mm = substr($file, $pos + 2, 3);
$yyyy = substr($file, $pos + 5, 4);
return substr($file, 0, $pos) . "$yyyy${months[$mm]}$dd.txt";
}
function sort_func($a, $b) {
return convertLogFilename($a) < convertLogFilename($b);
}
/* Your program */
$files = Array(
"channel.log.18Apr2011.txt",
"channel2.log.21Jan2002.txt"
);
usort($files, 'sort_func');
print_r($files);
?>
输出:
Array
(
[0] => channel2.log.21Jan2002.txt
[1] => channel.log.18Apr2011.txt
)
这应该比为每个文件名创建完整日期表示要快得多。