J'ai un contenant Chiffres romains (sous forme de ficelles bien sûr). Comme ceci :
$a = array('XIX', 'LII', 'V', 'MCCXCIV', 'III', 'XIII');
J'aimerais les trier selon les valeurs numériques de ces chiffres, donc les résultats devraient être quelque chose comme :
$sorted_a = array('III', 'V', 'XIII', 'XIX', 'LII', 'MCCXCIV');
Donc ma question est : Quelle est la meilleure façon de trier un tableau de chiffres romains ? Je sais comment utiliser les fonctions de tri des tableaux de PHP, mais je suis intéressé par la logique de la fonction de comparaison.
EDIT : Pour des raisons de simplicité, je ne cherche qu'un moyen qui traite les chaînes construites à partir des chiffres de base de manière standard (pas de CCCC
par exemple) :
I, V, X, L, C, D, M
RÉSULTATS DES TESTS
J'ai pris le temps de tester de manière approfondie tous les exemples de code qui ont été postés. Deux tests ont été effectués, un avec un tableau aléatoire de 20 chiffres romains, et un second avec un tableau contenant 4000 de ces chiffres. Même machine, beaucoup d'itérations, un temps moyen pris, et tout ceci exécuté plusieurs fois. Bien sûr, cela n'a rien d'officiel, ce sont juste mes propres tests.
TEST AVEC 20 CHIFFRES :
- hakre , bazmegakapa - environ 0,0005 s
- anemgyenge , Andrea , Dirk McQuickly - environ 0,0010 s
- Joe Nelson - environ 0,0050 s
- Rob Hruska - environ 0,0100 s
TEST AVEC 4000 CHIFFRES :
- hakre , bazmegakapa - environ 0,13 s
- anemgyenge - environ 1,4 s
- Dirk McQuickly , Andrea - environ 1,8 s
- Rob Hruska - environ 2,8 s
- Joe Nelson - environ 15 s (surprise, vérifié plusieurs fois)
J'ai du mal à attribuer la prime. hakre et moi avons fait les versions les plus rapides, en suivant la même route, mais il a fait une variante de la mienne, qui était auparavant basée sur l'idée de borrible. Donc je vais accepter la solution de hakre, parce que c'est la plus rapide et plus belle que la mienne (IMO). Mais je vais attribuer la prime à anemgyenge, parce que j'aime sa version et que beaucoup d'efforts semblent avoir été faits.