[201 vues] 2022-02-15 Emmanuel Orchanian
NOTE : cet article a été affiché dans sa langue originale.
Problème
Si vous avec un ancien système d'exploitation ou que vous codez innocemment des nombres, de cette manière là :
$a = [
'dossier 1',
'dossier 2',
'dossier 3',
'dossier 4',
'dossier 5',
'dossier 6',
'dossier 7',
'dossier 8',
'dossier 9',
'dossier 10',
'dossier 11'] ;
sort($a); // trier le tableau
Il se peux que vous tombez sur le problème stupide suivant :
'dossier 1',
'dossier 10',
'dossier 11',
'dossier 2',
'dossier 3',
'dossier 4',
'dossier 5',
'dossier 6',
'dossier 7',
'dossier 8',
'dossier 9'
La différence entre les chiffres et les lettres
L'ordre alphabétique
Consiste à prendre la lettre la plus à gauche, si deux lettres sont les mêmes, alors on prends la seconde lettre.
Corine Arthur Arthur
Roméo Corine Camille
Arthur Camille Caroline
Camille Matthieu Matthieu
Zara Roméo Roméo
Matthieu Zara Zara
L'ordre numérique
Ranger des nombres du plus petit au plus grand consiste à d'abord donner la même longueur à chaque nombre en rajoutant des zéros à gauche avant de les considérer de la même manière à les ranger dans l'ordre alphabétique
32 0 32 032 032 008
122 122 122 008 032
8 00 8 008 122 122
(petite parenthèse : sur machine à écrire, la lettre O était aussi le chiffre zéro, et la lettre I était le chiffre 1. Ainsi les chiffres n'allaient que de 2 à 9)
D'où vient le problème du 11 avant le 2 ?
Vous l'avez sans doute deviné, le 11 viens avant le 2 car l'ordinateur ne considère par 11 et 2 comme des nombres, mais comme des mots...
En d'autres termes, lors du rangement, il ne rajoute pas des zéros à gauche :
32 122
122 32
88 8
Si vous avez du mal à comprendre, remplacez dans votre têtes les chiffres par des lettres, par exemple
0 = a
b = 1
c = 2 ...
32 dc dc bcc 122
122 bcc bcc dc 32
8 i i i 8
Même exemple avec 1, 2 et 11
1 b b b 1
2 c c bb 11
11 bb bb c 2
Comment résoudre ce problème ?
C'est un problème souvent résolut pour les logiciels publics
Souvent, c'est déjà résolu ! Par exemple dans Windows, avant il y avait ce souci avec les noms de dossier et de fichier, à présent essayez, vous verrez que le problème n'existe plus.
Cependant, il est toujours présent par exemple dans l'utilisation de certains serveurs ou le fonctionnement interne de logiciels, alors comment faire ?
Ajouter des zéros devant les nombres
REMPLACEZ PAR
1 0001
2 0002
3 0003
...
9 0009
10 0010
11 0011
...
101 0101
102 0102
103 0103
Attention, le nombre de zéro défini votre maximum, c'est-à-dire commencer avec trois zéros, "0001" indique que 9999 sera votre plus grand nombre, disons 10 000 c'est pareil...
Si vous ne mettez que un seul zéro, vos fichiers seront bons que jusqu'à 100... et 100 ce n'est pas beaucoup, il vaut mieux sur-estimer les nombres à l'avenir plutôt que les sous-estimer.
Parce ce que si vous visez mal, cela signifie que vous rajouterez un 0 devant 100 fichiers ? Jamais de la vie !
Personnellement j'en met trois, ainsi j'ai 10 000 possibilité je ne stresse pas.
Utiliser le tri "naturel"
Il existe 3 tris :
- le tri alphabétique
- le tri numérique
- le tri naturel
Le tri naturel est un tri plus récent, il est alphabétique sur les textes, de telle sorte que si on tombe sur des nombres dans le texte, on le range dans l'ordre numérique.
En d'autre terme c'est un tri compliqué point de vue ordinateur, et c'est le tri naturel que ferait un être humain.
natsort($tableau);
La fonction natsort($tableau) de PHP permet d'effectuer le tri naturel.
Je conseille aux programmeurs de vérifier si leur algorithme de tri de fais pas naïvement un tri alphabétique/numérique, et de préférer chercher la méthode qui effectuerai un tri naturel.
On néglige le problème
En informatique, si on a un problème, une manière de le résoudre est de décider qu'on le laisse comme il est ! 😃 Puis on s'habitue à le voir 1,10,11,2,3,4...
- C'est pratique
- C'est rapide, pour ne pas dire instantané
- C'est pas cher, dans le sens c'est gratuit
- C'est rentable
- Ça marche souvent
- C'est de la résilience, de la sagesse (bon OK j'arrête 😁)
Merci d'avoir lu !
Si en général vous avez une question, une curiosité, n'hésitez pas me contacter.