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.
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.
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.
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.
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.