Я работаю с PHP-скриптом, который позволяет вести хронологический просмотр сгенерированных Eggdrop IRC-журналов. Первоначально я читал содержимое каталога и вставлял имена журналов в массив на основе даты изменения файла. Однако после недавнего перемещения сервера даты обновления файлов были обновлены, и навигация теперь неупорядоченная!
Структура имени файла журнала выглядит следующим образом:
channel.log.dayMONTHyear.txt
например:
shrawberry.log.08Apr2011.txt
, который из-за того, что он достаточно читабелен, трудно правильно заказать.
Поскольку код месяца всегда состоит из трех символов и занимает предсказуемую позицию в последовательности, я мог бы вручную проанализировать нестандартный код даты в метку времени Unix, выполнить итерацию по списку и добавить каждый элемент в массив с этой меткой времени а затем отсортировать массив по этому номеру.
Но это звучит чрезмерно.
Я на деньгах или предложенное мной решение идеально?
С помощью Марка Б. я реализовал следующее:
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);
}
Это успешно сортирует мои журналы, без необходимости копаться в моем массиве.