Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Order files by unconventional date in filename (PHP)

Tags:

php

eggdrop

I'm working with a PHP script that allows the chronological browsing of Eggdrop-generated IRC logs. Initially, I was reading the directory contents and inserting the log names into an array based on file modification date. After a recent server move, however, the files have had their modification dates updated and the navigation is now disorderly!

The log filename structure looks like:

channel.log.dayMONTHyear.txt

for example:

shrawberry.log.08Apr2011.txt

which, for being quite human-readable, is difficult to order properly.

Since the month code is always three characters long and comes in a predictable position in the sequence, I could manually parse the nonstandard date code into a Unix timestamp, iterate through the list and add each item to an array with that timestamp, and then sort the array by that number.

But that sounds excessive.

Am I on the money, or is the solution I proposed ideal?


With Marc B.'s help, I've implemented the following:

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);
}

This successfully sorts my logs, without needing to muck around with my array.

like image 545
Winfield Trail Avatar asked Jan 31 '26 02:01

Winfield Trail


1 Answers

Your example filename doesn't match the "looks like" sample - the 'txt' and date string are reversed. but in any case, you can use the PHP usort() function, which lets a user-defined function do the comparisons.

It may not be particularly efficient, but you'd do something like this:

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');
like image 73
Marc B Avatar answered Feb 02 '26 15:02

Marc B