Position actuelle: Accueil> Derniers articles> Comment utiliser la fonction StrnatcasecMP de PHP pour combiner array_map pour trier et formater les chaînes dans un tableau?

Comment utiliser la fonction StrnatcasecMP de PHP pour combiner array_map pour trier et formater les chaînes dans un tableau?

gitbox 2025-05-27

Dans la programmation PHP quotidienne, nous devons souvent trier les tableaux de chaînes, mais le tri par défaut du dictionnaire ( tri , USORT , etc.) ne gère pas bien les chaînes avec les nombres. Par exemple, si des noms de fichiers tels que img1.png , img2.png , img10.png sont comparés aux chaînes ordinaires, le résultat de tri sera img1.png , img10.png , img2.png , qui ne se conforme évidemment pas aux habitudes de tri naturelles humaines.

Afin d'atteindre le «tri naturel», PHP fournit respectivement les fonctions StrnatCMP et StrnatcasecMP , correspondant à un tri naturel sensible à la cas et insensible à la caisse, respectivement.
De plus, lorsque nous trierons le tableau, nous devons souvent formater uniformément chaque élément du tableau, comme tourner tous les minuscules ou retirer les espaces inutiles. Pour le moment, nous pouvons utiliser Array_Map pour y parvenir.

Cet article présentera comment combiner ces deux outils, formater uniformément les cordes du tableau, puis les trier naturellement.

Étapes de base

1 ?? Préparer le tableau de données <br> Prenons un ensemble de noms de fichiers comme exemple:

 $files = ['Img10.png', 'img2.png', 'IMG1.png', 'img20.png', 'img11.png'];

2 ?? Format des éléments utilisant array_map <br> Supposons que nous voulons tous les convertir en minuscules:

 $formattedFiles = array_map('strtolower', $files);

Si vous souhaitez faire face à des choses plus complexes (comme les dis-spaces et les extensions unifiées), vous pouvez écrire des fonctions anonymes:

 $formattedFiles = array_map(function($item) {
    return strtolower(trim($item));
}, $files);

3 ?? Fonction de tri personnalisée
USORT de PHP nous permet de trier avec des fonctions personnalisées:

 usort($formattedFiles, 'strnatcasecmp');

Remarque: StrnatcasecMP est une fonction de comparaison, pas une fonction qui est utilisée directement pour le tri.

Exemple de code complet

 <?php
$files = ['Img10.png', 'img2.png', 'IMG1.png', 'img20.png', 'img11.png'];

// premier pas:Format unifié(Tourner en minuscules + Retirer les espaces)
$formattedFiles = array_map(function($item) {
    return strtolower(trim($item));
}, $files);

// Étape 2:Tri naturel(Cas insensible au cas)
usort($formattedFiles, 'strnatcasecmp');

// Résultat de sortie
foreach ($formattedFiles as $file) {
    echo $file . "\n";
}
?>

Résultats en cours:

 img1.png
img2.png
img10.png
img11.png
img20.png

Exemple plus pratique: situation avec URL

Supposons que nous ayons affaire à un ensemble d'URL:

 $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',
];

Nous voulons trier par partie de nom de fichier, nous pouvons d'abord extraire le nom du fichier, puis trier:

 <?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',
];

// Extraire la pièce de nom de fichier et la lier à URL
$mapped = array_map(function($url) {
    $parts = parse_url($url);
    $file = basename($parts['path']);
    return ['url' => $url, 'file' => strtolower($file)];
}, $urls);

// 按文件名Tri naturel
usort($mapped, function($a, $b) {
    return strnatcasecmp($a['file'], $b['file']);
});

// Sortie triée URL
foreach ($mapped as $item) {
    echo $item['url'] . "\n";
}
?>

Sortir:

 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