How to sort a list of files by name, extension, dates, and size in PHP

1 Answer

0 votes
// ------------------------------------------------------------
// Date struct for proper date handling
// ------------------------------------------------------------
function makeDate(int $y, int $m, int $d): array {
    return ["year" => $y, "month" => $m, "day" => $d];
}

// ------------------------------------------------------------
// print a date in YYYY-MM-DD format
// ------------------------------------------------------------
function formatDate(array $d): string {
    return sprintf("%04d-%02d-%02d", $d["year"], $d["month"], $d["day"]);
}

// ------------------------------------------------------------
// File entry struct
// ------------------------------------------------------------
function makeFile(string $name, string $ext, array $date, int $size): array {
    return [
        "name"      => $name,      // file name without extension
        "extension" => $ext,       // extension including dot
        "date"      => $date,      // real date struct
        "size"      => $size       // bytes
    ];
}

// ------------------------------------------------------------
// Sort by name (lexicographically)
// ------------------------------------------------------------
function sortByName(array &$files): void {
    usort($files, fn($a, $b) => strcmp($a["name"], $b["name"]));
}

// ------------------------------------------------------------
// Sort by extension (lexicographically)
// ------------------------------------------------------------
function sortByExtension(array &$files): void {
    usort($files, fn($a, $b) => strcmp($a["extension"], $b["extension"]));
}

// ------------------------------------------------------------
// Sort by date (year → month → day)
// ------------------------------------------------------------
function sortByDate(array &$files): void {
    usort($files, function($a, $b) {
        if ($a["date"]["year"] !== $b["date"]["year"])
            return $a["date"]["year"] <=> $b["date"]["year"];

        if ($a["date"]["month"] !== $b["date"]["month"])
            return $a["date"]["month"] <=> $b["date"]["month"];

        return $a["date"]["day"] <=> $b["date"]["day"];
    });
}

// ------------------------------------------------------------
// Sort by size (ascending)
// ------------------------------------------------------------
function sortBySize(array &$files): void {
    usort($files, fn($a, $b) => $a["size"] <=> $b["size"]);
}

// ------------------------------------------------------------
// print file list
// ------------------------------------------------------------
function printFiles(array $files): void {
    foreach ($files as $f) {
        echo "{$f["name"]}{$f["extension"]}  " .
             formatDate($f["date"]) . "  " .
             "{$f["size"]} bytes\n";
    }
    echo "\n";
}

// ------------------------------------------------------------
// Main program
// ------------------------------------------------------------

$files = [
    makeFile("G1zTo5jJk", ".jpg", makeDate(2007,7,8), 51954),
    makeFile("LTEE4SI0j", ".jpg", makeDate(2011,11,13), 43442),
    makeFile("PDqmuO3GH", ".cpp", makeDate(2004,5,21), 3346),
    makeFile("qJO2qjukZ", ".png", makeDate(2010,8,27), 67087),
    makeFile("HqclTqxb4", ".cpp", makeDate(2020,9,5), 70531),
    makeFile("imVyTyoaF", ".jpg", makeDate(2011,3,19), 43846),
    makeFile("rXwXdy8XO", ".txt", makeDate(2017,10,12), 70193),
    makeFile("9Z4fbOBUc", ".pdf", makeDate(2004,6,9), 1754),
    makeFile("ZHahuu4vS", ".txt", makeDate(2003,10,10), 65126),
    makeFile("0SnZHh2GT", ".png", makeDate(2006,10,18), 25890)
];

echo "Original:\n";
printFiles($files);

echo "Sorted by name:\n";
sortByName($files);
printFiles($files);

echo "Sorted by extension:\n";
sortByExtension($files);
printFiles($files);

echo "Sorted by date:\n";
sortByDate($files);
printFiles($files);

echo "Sorted by size:\n";
sortBySize($files);
printFiles($files);




/*
run:

Original:
G1zTo5jJk.jpg  2007-07-08  51954 bytes
LTEE4SI0j.jpg  2011-11-13  43442 bytes
PDqmuO3GH.cpp  2004-05-21  3346 bytes
qJO2qjukZ.png  2010-08-27  67087 bytes
HqclTqxb4.cpp  2020-09-05  70531 bytes
imVyTyoaF.jpg  2011-03-19  43846 bytes
rXwXdy8XO.txt  2017-10-12  70193 bytes
9Z4fbOBUc.pdf  2004-06-09  1754 bytes
ZHahuu4vS.txt  2003-10-10  65126 bytes
0SnZHh2GT.png  2006-10-18  25890 bytes

Sorted by name:
0SnZHh2GT.png  2006-10-18  25890 bytes
9Z4fbOBUc.pdf  2004-06-09  1754 bytes
G1zTo5jJk.jpg  2007-07-08  51954 bytes
HqclTqxb4.cpp  2020-09-05  70531 bytes
LTEE4SI0j.jpg  2011-11-13  43442 bytes
PDqmuO3GH.cpp  2004-05-21  3346 bytes
ZHahuu4vS.txt  2003-10-10  65126 bytes
imVyTyoaF.jpg  2011-03-19  43846 bytes
qJO2qjukZ.png  2010-08-27  67087 bytes
rXwXdy8XO.txt  2017-10-12  70193 bytes

Sorted by extension:
HqclTqxb4.cpp  2020-09-05  70531 bytes
PDqmuO3GH.cpp  2004-05-21  3346 bytes
G1zTo5jJk.jpg  2007-07-08  51954 bytes
LTEE4SI0j.jpg  2011-11-13  43442 bytes
imVyTyoaF.jpg  2011-03-19  43846 bytes
9Z4fbOBUc.pdf  2004-06-09  1754 bytes
0SnZHh2GT.png  2006-10-18  25890 bytes
qJO2qjukZ.png  2010-08-27  67087 bytes
ZHahuu4vS.txt  2003-10-10  65126 bytes
rXwXdy8XO.txt  2017-10-12  70193 bytes

Sorted by date:
ZHahuu4vS.txt  2003-10-10  65126 bytes
PDqmuO3GH.cpp  2004-05-21  3346 bytes
9Z4fbOBUc.pdf  2004-06-09  1754 bytes
0SnZHh2GT.png  2006-10-18  25890 bytes
G1zTo5jJk.jpg  2007-07-08  51954 bytes
qJO2qjukZ.png  2010-08-27  67087 bytes
imVyTyoaF.jpg  2011-03-19  43846 bytes
LTEE4SI0j.jpg  2011-11-13  43442 bytes
rXwXdy8XO.txt  2017-10-12  70193 bytes
HqclTqxb4.cpp  2020-09-05  70531 bytes

Sorted by size:
9Z4fbOBUc.pdf  2004-06-09  1754 bytes
PDqmuO3GH.cpp  2004-05-21  3346 bytes
0SnZHh2GT.png  2006-10-18  25890 bytes
LTEE4SI0j.jpg  2011-11-13  43442 bytes
imVyTyoaF.jpg  2011-03-19  43846 bytes
G1zTo5jJk.jpg  2007-07-08  51954 bytes
ZHahuu4vS.txt  2003-10-10  65126 bytes
qJO2qjukZ.png  2010-08-27  67087 bytes
rXwXdy8XO.txt  2017-10-12  70193 bytes
HqclTqxb4.cpp  2020-09-05  70531 bytes

*/

 



answered 23 hours ago by avibootz

Related questions

...