Position actuelle: Accueil> Derniers articles> Conseils pour tri les noms de fichiers à l'aide de strnatcmp

Conseils pour tri les noms de fichiers à l'aide de strnatcmp

gitbox 2025-05-27

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

1. Utilisation de base

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
)

2. Problèmes de sensibilité aux cas

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");
?>

3. Traitement des compétences pour les chemins de fichier en tri

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));
});
?>

4. L'impact des extensions de fichiers

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));
});
?>

5. Traitement de la disposition des répertoires mixtes et des fichiers

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.

6. combinant le tri naturel pour atteindre une logique de tri plus complexe

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;
});
?>

7. Scénarios applicables et scénarios peu applicables

Scénarios applicables:

  • 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

Scénarios non applicables:

  • 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

Conclusion

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.