Aktueller Standort: Startseite> Neueste Artikel> Wie sortiere ich Dateinamen mit Präfixen über strnatcasecmp?

Wie sortiere ich Dateinamen mit Präfixen über strnatcasecmp?

gitbox 2025-05-27

In der Dateiverwaltung, der Ressourcenlade- oder der Versionskontrollszenarien stoßen wir häufig auf das Problem der Sortierung einer Reihe von vorangestellten Dateinamen. Beispielsweise könnte eine Dateiliste so aussehen:

 file1.txt, file10.txt, file2.txt, file20.txt

Wenn Sie direkt mit normalen String -Vergleiche ( STRCMP- oder Usort -Standardregeln) sortieren, kann das Ergebnis sein:

 file1.txt, file10.txt, file2.txt, file20.txt

Dies ist offensichtlich nicht die "natürliche Reihenfolge", die wir erwarten - intuitiv sollte File2.txt vor Datei10.txt voraus sein.

Um dieses Problem zu lösen, bietet PHP eine sehr nützliche Funktion: strnatcasecmp . Es kann verwendet werden, um Vergleiche mit fälschlichen Natürlichkeiten durchzuführen.

Was ist Strnatcasecmp ?

STRNATCASECMP ist eine integrierte String-Vergleichsfunktion in PHP, mit der Fall-unempfindliche Vergleiche in "natürlicher Reihenfolge" hergestellt werden.

Die sogenannte "natürliche Ordnung" bedeutet, dass die Zahlen-Teile eher durch numerische Werte als nur durch Zeichen verglichen werden. Zum Beispiel liegt 10 hinter 2 , weil 10> 2 , nicht weil der ASCII von Charakter 1 kleiner als 2 ist.

Beispiel: Dateinamen mit Präfixen sortieren

Angenommen, wir haben die folgende Liste von Dateien:

 $files = [
    'file10.txt',
    'file2.txt',
    'file1.txt',
    'file20.txt',
    'file11.txt'
];

Wir wollen sie in natürlicher Reihenfolge sortieren, und das können wir tun:

 usort($files, function($a, $b) {
    return strnatcasecmp($a, $b);
});

print_r($files);

Auslaufergebnisse:

 Array
(
    [0] => file1.txt
    [1] => file2.txt
    [2] => file10.txt
    [3] => file11.txt
    [4] => file20.txt
)

Wie Sie sehen können, wird File10.txt hinter File2.txt eingestuft, anstatt wie normale String -Vergleiche nicht in Ordnung zu sein.

Komplexere Beispiele: mit Pfad oder voller URL

Wenn Ihr Dateiname die vollständige URL ist, zum Beispiel:

 $files = [
    'https://gitbox.net/file10.txt',
    'https://gitbox.net/file2.txt',
    'https://gitbox.net/file1.txt',
    'https://gitbox.net/file20.txt',
    'https://gitbox.net/file11.txt'
];

Sie können die gleiche Usort -Sortierungsmethode direkt verwenden:

 usort($files, function($a, $b) {
    return strnatcasecmp($a, $b);
});

print_r($files);

HINWEIS : STRNATCASECMP verglichen die Gesamtzeichenfolge, einschließlich Protokoll- und Domainnamen. Wenn Sie den Dateinamen -Teil nur sortieren möchten, müssen Sie Parse_url und BaseName zuerst den Dateinamen extrahieren.

Nur nach Dateinamen sortieren (Ignorieren Sie URL -Präfixe)

Wenn Sie nur nach Dateiname -Teil sortieren möchten (ignorieren Sie https://gitbox.net/ ), können Sie dies tun:

 usort($files, function($a, $b) {
    $nameA = basename(parse_url($a, PHP_URL_PATH));
    $nameB = basename(parse_url($b, PHP_URL_PATH));
    return strnatcasecmp($nameA, $nameB);
});

print_r($files);

Dies stellt sicher, dass die Sortierung auch dann auf dem Dateinamen basiert, wenn der Präfixteil der URL unterschiedlich ist.