Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/12/2010, 19h05   #1
Invité de passage
 
olivier
Inscription : décembre 2010
Messages : 3
Détails du profil
Informations personnelles :
Nom : olivier

Informations forums :
Inscription : décembre 2010
Messages : 3
Points : 0
Points : 0
Par défaut Calcul l'écart entre deux numéros d'immatriculation

Bonjour,

Je me présente, Olivier, 30 ans, résidant sur Bordeaux, chauffeur poids lourd (oui ça na rien à voir avec la programmation ). Je suis nouveau sur le forum et j'utilise PHP depuis 7 ans maintenant. Je maintiens un site sur les plaques minéralogiques des voitures et, à ce titre, j'aimerais développer une fonction permettant de calculer l'écart entre deux numéros d'immatriculation. Dit comme ça, ça à l'air simple, mais en réalité, je tourne le problème dans tous les sens et je ne sais pas vraiment comment procéder pour coder tout ça.

Par exemple, je cherche combien de numéros ont été distribués entre le BE-015-RX et le BF-124-CX.

La numérotation se fait de droite à gauche et va de 001 à 999. Les lettres I,O et U sont exclues ainsi que la combinaison SS.
Donc pour résumer, après le BE-999-RX, on passera au BE-001-RY et ce jusqu'à BE-999-ZZ pour passer ensuite au BF-001-AA. mais il n'y aura pas de BE-001-SS ou de BE-001-TU ni même de BE-001-UX. Autant dire qu'entre les deux numéros de mon exemple, y'en a pas mal de distribués mais aussi pas mal de supprimés

Reste que ça revient à faire des calculs de barbares et surtout, un truc que je ne connais pas, la soustraction entre deux lettres...

Pensez vous que cette opération soit réalisable en PHP et si oui, avez vous des pistes pour lancer la programmation ?

Merci pour votre aide

A+ Olivier
olive33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 19h45   #2
Membre éprouvé
 
Avatar de Tesing
 
Xavier Schepler
Étudiant
Inscription : septembre 2009
Messages : 273
Détails du profil
Informations personnelles :
Nom : Xavier Schepler
Âge : 28
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : septembre 2009
Messages : 273
Points : 402
Points : 402
Salut,

oui, c'est réalisable.
Quelques pistes :
On peut incrémenter une lettre, par exemple :
Code :
1
2
3
4
 
$l = 'A';
++$l;
echo $l; // affiche B
Tu peux utiliser les fonctions ord et chr, en particulier ord, qui renvoie le code ASCII numérique de la lettre. Par exemple :
Code :
1
2
3
4
 
echo ord('A') // affiche 65
echo ord('B') // affiche 66
// ord('C') vaut 67 etc ...
Il faudra une fonction pour incrémenter les combinaisons de caractères.
__________________
Keep it simple, stupid !
Tesing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 19h47   #3
Membre chevronné
 
Inscription : mars 2005
Messages : 583
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 583
Points : 651
Points : 651
hmm, un début de piste, comme ça, au débotté :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//décomposition de la plaque
list( $lettres1 , $chiffres , $lettres2 ) = explode( '-' , $numPlaque );
 
//analyse des lettres :
$val1 = ord( $lettres1[0] ) - 65; //ord récupère la valeur ascii de la lettre - A = 65, donc A-65 = 0
$val2 = ord( $lettres1[1] ) - 64; // idem qu'au dessus, mais A doit valoir 1 (au final AA vaudrait 01 ) 
 
// ici il faut ajuster selon les valeurs à retirer
// si lettre > 'O' alors il faut ajuster la valeur en retirant O de l'alphabet
if( $val2 > ( ord( 'O' ) - 64 ) ) $val2 -= 1;
// à faire pour toutes les lettres retirées de l'alphabet
 
// calcul de la valeur de LL (Lettre Lettre)
$valeur1 = ( $val1 * 26 ) + $val2;
 
// et a refaire pour l'autre groupe de lettres
Code écrit directement sur le forum, non testé.
__________________
Pourfendeur de singletons en croisade
Petibidon est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 20h05   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
pour convertir tes lettres en nombres

Code :
1
2
3
4
5
6
7
8
9
10
$str = 'AA';
$count = 0;
 
foreach(array_reverse(str_split($str)) as $p => $l)
{
    $count += pow(24, $p) * (ord($l) - 64);
}
 
echo $count;
//25
suffis de faire quasiment le même principe pour le reste
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2010, 18h52   #5
Invité de passage
 
olivier
Inscription : décembre 2010
Messages : 3
Détails du profil
Informations personnelles :
Nom : olivier

Informations forums :
Inscription : décembre 2010
Messages : 3
Points : 0
Points : 0
Merci pour votre aide !

J'ai déjà pas mal progressé à partir de la méthode proposée par stealth35. juste un bug bizarre. Par cette méthode, si je tape AY en valeur de $str, il me retournera 49 et je tape BA pour cette variable, il me retournera le même résultat et ça le fait pour toute les séries comprises entre xY et yB...

A+ Olive
olive33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2010, 20h10   #6
Invité de passage
 
olivier
Inscription : décembre 2010
Messages : 3
Détails du profil
Informations personnelles :
Nom : olivier

Informations forums :
Inscription : décembre 2010
Messages : 3
Points : 0
Points : 0
En fait j'ai trouvé. Il suffit de remplacer 24 par 26 sur cette ligne :

Code :
 $count += pow(24, $p) * (ord($l) - 64);
Je reviens vers vous au besoin.

Encore merci

A+ Olivier
olive33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2010, 11h05   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par olive33 Voir le message
En fait j'ai trouvé. Il suffit de remplacer 24 par 26 sur cette ligne :

Code :
 $count += pow(24, $p) * (ord($l) - 64);
Je reviens vers vous au besoin.

Encore merci

A+ Olivier
arf oui, je sais pas pourquoi j'ai mis 24 trop l'habitude de bosser avec les multiples de 8
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h33.


 
 
 
 
Partenaires

Hébergement Web