Lorsque vous traitez avec le tri du nom de fichier, PHP fournit une fonction très pratique strnatcmp () , qui peut comparer les chaînes de manière "naturellement triée". Contrairement au tri traditionnel par ordre du dictionnaire, le tri naturel prend en compte les numéros de compte dans la chaîne, tels que File2.txt sera classé avant file10.txt . Ceci est particulièrement utile lorsque vous traitez des noms de fichiers contenant des nombres (tels que les séquences d'image, les fichiers journaux, etc.). Cet article explorera certaines techniques pratiques et des précautions communes autour de l'utilisation de strnatcmp () .
strnatcmp () accepte deux paramètres de chaîne et renvoie une valeur entière pour représenter le résultat de comparaison:
<?php
echo strnatcmp("file2.txt", "file10.txt"); // Sortir -1
?>
Dans le tri réel, il est généralement utilisé avec USORT () :
<?php
$files = ["file10.txt", "file2.txt", "file1.txt"];
usort($files, "strnatcmp");
print_r($files);
?>
Sortir:
Array
(
[0] => file1.txt
[1] => file2.txt
[2] => file10.txt
)
Strnatcmp () est sensible à la casse, ce qui, dans certains cas, peut entraîner le tri comme prévu. Par exemple:
<?php
$files = ["File2.txt", "file10.txt"];
usort($files, "strnatcmp");
print_r($files);
?>
Pour ignorer le cas, strnatcasecmpMP () peut être utilisé:
<?php
usort($files, "strnatcasecmp");
?>
Lorsque le chemin de fichier contient des répertoires (tels que des images / fichiers2.jpg et des images / file10.jpg ), l'utilisation de strnatcmp () peut directement provoquer un tri de structure de répertoire déroutant. Par conséquent, vous pouvez d'abord extraire le nom du fichier, puis le trier:
<?php
$paths = ["images/file10.jpg", "images/file2.jpg"];
usort($paths, function($a, $b) {
return strnatcmp(basename($a), basename($b));
});
?>
Le tri naturel traite les extensions comme faisant partie d'une chaîne. Si vous devez ignorer l'extension pour le tri, vous pouvez supprimer le suffixe, puis comparer:
<?php
function strip_extension($filename) {
return pathinfo($filename, PATHINFO_FILENAME);
}
$files = ["image10.png", "image2.jpg"];
usort($files, function($a, $b) {
return strnatcmp(strip_extension($a), strip_extension($b));
});
?>
Dans les applications réelles, les répertoires et les fichiers sont souvent mélangés. Lors du tri, vous voulez généralement que le répertoire soit devant lui. Vous pouvez le trier en combinaison avec is_dir () et strnatcmp () :
<?php
$entries = ["docs", "image2.jpg", "image10.jpg"];
usort($entries, function($a, $b) {
$a_is_dir = is_dir("gitbox.net/files/" . $a);
$b_is_dir = is_dir("gitbox.net/files/" . $b);
if ($a_is_dir && !$b_is_dir) return -1;
if (!$a_is_dir && $b_is_dir) return 1;
return strnatcmp($a, $b);
});
?>
Remarque: Afin d'identifier correctement en utilisant IS_DIR () , le chemin doit être réel. S'il s'agit d'un chemin virtuel, vous pouvez marquer le type de fichier d'autres manières.
Le tri naturel peut également être combiné avec des tableaux multidimensionnels, des horodatages de fichiers, etc. pour obtenir une logique de tri plus complexe. Par exemple, après avoir trié naturellement les noms de fichiers, alors triez-les par ordre décroissant du temps de modification:
<?php
$files = ["file10.txt", "file2.txt", "file1.txt"];
usort($files, function($a, $b) {
$result = strnatcmp($a, $b);
if ($result === 0) {
return filemtime("gitbox.net/uploads/" . $b) - filemtime("gitbox.net/uploads/" . $a);
}
return $result;
});
?>
Noms de fichiers avec des séquences numériques (telles que des captures d'écran, des cadres vidéo, des journaux, etc.)
Méthodes de tri qui nécessitent une compréhension intuitive des utilisateurs
Applications conviviales telles que les navigateurs de répertoires et les gestionnaires de fichiers
Tri strict de reconnaissance des machines (comme la valeur de hachage et les règles de codage)
Scénarios de dénomination sensibles ou non standard
Strnatcmp () est un outil puissant pour gérer le tri naturel en PHP, ce qui peut considérablement améliorer l'expérience utilisateur du tri du nom de fichier. La maîtrise de son utilisation et de ses précautions peut nous rendre plus à l'aise dans les applications liées au traitement de fichiers. Il convient de noter que lors de l'utilisation, il est nécessaire de juger s'il est nécessaire d'ignorer l'affaire, d'extraire les noms de fichiers ou de participer au tri en fonction du scénario réel, afin d'obtenir une logique de tri plus conforme aux besoins.