Newsgroup: it.comp.www.php
Titolo: Algoritmo targhe

Qualcuno è a conoscenza di un algoritmo per la generazione di
"targhe"?
Ho la necessità di generare un codice univoco ed incrementale tipo una
targa: AA000AA
Una volta passata la targa, lui dovrebbe incrementare prima tutti i
numeri fino 999, dopo di che resetta i numeri a 000 e incrementa (da
destra verso sinistra) le lettere quindi
AA000AA
AA001AA
AA999AA
AA000AB
AA999AB
AC000GZ

 ha detto:

Mi pare che tu l'abbia appena esposto l'algoritmo.
Francesco Mazzi
Webmaster di AltroPC.it - 
http://www.altropc.it
 
Dev.Staff di E-Xoopport - 
http://dev.e-xoopport.it

 Mi pare che tu l'abbia appena esposto l'algoritmo.
Si è un semplice ciclo....
Volevo sapere se qualcuno l'avesse già fatto....
Altrimenti provvederò da me.

Alessandro ha scritto:

Ahh pigrizia estiva che cosa fai fare...

> Ahh pigrizia estiva che cosa fai fare...
Piu o meno....
Comunque ho risolto modificando un mega ciclo trovato negli archivi del
NG.
Adesso sta inserendo tutte le *targhe* nel database....penso che
finisca prima di domani.....
sono la bellezza di 460 milioni e rotti di record

 sono la bellezza di 460 milioni e rotti di record
domanda stupida: a che ti serve inserire TUTTE le targhe nel DB?
-- 
Come fai a fidarti di un Messenger che chiama
"Margherita arancione" una gerbera e "Cavalli
al galoppo" due cavalli fermi alla staccionata?

> domanda stupida: a che ti serve inserire TUTTE le targhe nel DB?
Risposta altrettanto stupida...
L'algoritmo che ho trovato era in un ciclo for...quindi parte e genera
le targhe...
Il problema adesso è il seguente: non riesco a far generare la targa
successiva a AA343XD per esempio.
Ovvero, se con quel for metto tutte le targhe nel db, le ho già tutte
li e non devo piu generarle dinamicamente (mi basta fare una update del
record anziche una insert).
Il massimo sarebbe inserirle di volta in volta, leggere l'ultima targa
inserita e generare la successiva.
Non sono capace :(

 record anziche una insert).
beh... -__-
fai la seguente: mappa uno ad uno i numeri con le targhe:
es:   0 -> AA000AA
      1 -> AA001AA
      ...
   1000 -> AA000AB
      ...
una volta trovata la legge che associa la targa all'indice numerico e
create due funzioni opportune targa2indice e indice2targa, data una targa
per trovare la successiva dovrai fare:
$successiva = indice2targa(targa2indice($targa_data) + 1);


> fai la seguente: mappa uno ad uno i numeri con le targhe:
Be certo, cosi è facile.
Però i numeri con le targhe sono del tipo
AA000AA
Che tradotto in numeri:
26*26*26*26*999 = 456.519.024
Devo fare un array di 456 milioni di record?
Con il ciclo che buttava tutto su mysql ne ho inseriti circa 7 milioni
in una mezzora....
ripeto il massimo sarebbe avere una targa (AA000AA) e generare la
seguente.
E' fattibile, ma io non so da dove cominciare.... Gli algoritmi non
sono il mio forte.
Se serve ti posto il codice.

 Non sono capace :(
Il NG esiste per questo ;-)

 Il NG esiste per questo ;-)
Bene!

Ho appena scoperto che
$a = "AA";
$a++;
echo $a;
stampa "AB"
proprio quello che mi serviva...io è da stamattica che cerco di fare
sta roba....e la fa php di suo..ma vaffff

 Devo fare un array di 456 milioni di record?
non devi fare un array: non ti serve generarle tutte. Ti basta una funzione
che dato un numero ti restituisce una targa e viceversa.
Ti faccio un esempio semplificato:
supponi di avere targhe composte da un numero da 0 a 9 e una lettera da A a
Z. Avrai chiaramente 26*10 = 260 possibili targhe:
0A
0B
0C
...
5F
5G
5H
...
9X
9Y
9Z
dato un numero, es. 147, generi la targa:
147/26 = 5 -> primo elemento: 5
147 - 26*5 = 17; c(17) = lettera q -> secondo elemento: Q
per il viceversa, considera che Q corrisponde al 17 e ottieni
5*26 + n(Q) = 130 + 17 = 147


Alessandro ha scritto:

Ma lol.. se avessi cercato sul manuale le funzioni di strinche 
probabilmente ti saresti risparmiato un po di mal di testa :-)
Ciao!

26*26*26*26*999 = 456.519.024
Attenzione che non tutte le 26 lettere sono utilizzate nelle attuali
targhe italiane.

 "targhe"?
[..]
sotto c'e' una classe (migliorabile) con un esempio che puo' fare quello che
desideri..
ma a cosa serve questa generazione di targhe?
ho seri dubbi sul fatto che tu abbia scelto la strada migliore..
devi immagazzinare informazioni sulle targhe?
ci sono metodi e linee d'azione migliori..
[parzialmente testato /]
<?php
error_reporting(E_ALL);
class label {
  // label to integer
  function ltoi($label, $base = 10) {
    if (!preg_match_all('/[a-z]{2}([0-9]{3})[a-z]{2}/', $label, $matches)) {
      return FALSE;
    }
    $a = ord('a');
    return 
      base_convert(
        ((((ord($label{0}) - $a) * 26 + (ord($label{1}) - $a)) * 
        1000 + $matches[1][0]) * 26 + (ord($label{5}) - $a)) * 26 + 
        (ord($label{6}) - $a)
      , 10, $base);
  }
  // integer to label
  function itol($label, $base = 10) { 
    $label = base_convert($label, $base, 10);
    if ($label < 0 OR $label > 456975999 ) {
      return FALSE;
    }
    $a = ord('a');
    $result = chr($label % 26 + $a);
    $label /= 26;
    $result .= chr($label % 26 + $a);
    $label /= 26;
    $result .=  strrev(str_pad($label % 1000, 3, 0, STR_PAD_LEFT));
    $label /= 1000;
    $result .= chr($label % 26 + $a);
    $label /= 26;
    return strrev($result . chr($label % 26 + $a));
  }
}
$labelNumber = label::ltoi('gq398vg');
$labelName = label::itol($labelNumber);
echo "The number '$labelNumber' corresponds with univocity to the label
'$labelName'\n";
?>
-- 
www.iuz-lab.info

No devo fare un servizio di url brevi.
da
http://www.dasldmasdmdmlsamdlsamdlamdlsamdlamsldmasldmasldmaldmlamdlamdlamdlamdlamdlamdlamdlamdlasmdlasmldamldam.com
a:
http://www.dominio.com/AA343XX
per esempio.