Bei der täglichen PHP -Programmierung müssen wir häufig String -Arrays sortieren, aber das Standard -Wörterbuchsortieren ( sortieren , usort usw.) verarbeitet Strings nicht mit Zahlen. Wenn beispielsweise Dateinamen wie Img1.png , IMG2.Png , Img10.png mit gewöhnlichen Zeichenfolgen verglichen werden, wird das Sortierergebnis img1.png , img10.png , img2.png sein, was offensichtlich nicht den menschlichen natürlichen Sortier -Habits entspricht.
Um "natürliches Sortieren" zu erreichen, liefert PHP STRNATCMP- und STRNATCASTECMP -Funktionen, die der Fall-sensitiven bzw. Fall-unempfindlichen natürlichen Sortierung entsprechen.
Wenn wir das Array sortieren, müssen wir häufig jedes Element im Array einheitlich formatieren, z. Zu diesem Zeitpunkt können wir Array_Map verwenden, um dies zu erreichen.
In diesem Artikel wird vorgestellt, wie man diese beiden Werkzeuge kombiniert, die Saiten im Array gleichmäßig formatiert und sie dann auf natürliche Weise sortiert.
1 ?? Datenarray vorbereiten <br> Nehmen wir eine Reihe von Dateinamen als Beispiel:
$files = ['Img10.png', 'img2.png', 'IMG1.png', 'img20.png', 'img11.png'];
2 ?? Formatelemente mit Array_Map <br> Angenommen, wir wollen sie alle in Kleinbuchstaben umwandeln:
$formattedFiles = array_map('strtolower', $files);
Wenn Sie sich mit komplexeren Dingen (z. B. De-Space und einheitlichen Erweiterungen) befassen möchten, können Sie anonyme Funktionen schreiben:
$formattedFiles = array_map(function($item) {
return strtolower(trim($item));
}, $files);
3 ?? Benutzerdefinierte Sortierfunktion
Usort von PHP ermöglicht es uns, mit benutzerdefinierten Funktionen zu sortieren:
usort($formattedFiles, 'strnatcasecmp');
HINWEIS: STRNATCASECMP ist eine Vergleichsfunktion, keine Funktion, die direkt zum Sortieren verwendet wird.
<?php
$files = ['Img10.png', 'img2.png', 'IMG1.png', 'img20.png', 'img11.png'];
// Erster Schritt:Einheitliches Format(Kleinbuchstaben drehen + Räume entfernen)
$formattedFiles = array_map(function($item) {
return strtolower(trim($item));
}, $files);
// Schritt 2:Natürliche Sortierung(Fall unempfindlich)
usort($formattedFiles, 'strnatcasecmp');
// Ausgangsergebnis
foreach ($formattedFiles as $file) {
echo $file . "\n";
}
?>
Auslaufergebnisse:
img1.png
img2.png
img10.png
img11.png
img20.png
Angenommen, wir haben es mit einer Reihe von URLs zu tun:
$urls = [
'https://gitbox.net/File10.html',
'https://gitbox.net/file2.html',
'https://gitbox.net/FILE1.html',
'https://gitbox.net/file20.html',
'https://gitbox.net/file11.html',
];
Wir möchten nach dem Dateinamen Teil sortieren. Wir können zuerst den Dateinamen extrahieren und dann sortieren:
<?php
$urls = [
'https://gitbox.net/File10.html',
'https://gitbox.net/file2.html',
'https://gitbox.net/FILE1.html',
'https://gitbox.net/file20.html',
'https://gitbox.net/file11.html',
];
// Extrahieren Sie den Dateinamen -Teil und binden Sie es an an URL
$mapped = array_map(function($url) {
$parts = parse_url($url);
$file = basename($parts['path']);
return ['url' => $url, 'file' => strtolower($file)];
}, $urls);
// 按文件名Natürliche Sortierung
usort($mapped, function($a, $b) {
return strnatcasecmp($a['file'], $b['file']);
});
// Ausgabe sortiert URL
foreach ($mapped as $item) {
echo $item['url'] . "\n";
}
?>
Ausgabe:
https://gitbox.net/FILE1.html
https://gitbox.net/file2.html
https://gitbox.net/File10.html
https://gitbox.net/file11.html
https://gitbox.net/file20.html