Ciao a tutti!
ho bisogno di creare un contatore alfanumerico di 4 digit che parta da 0000 e finisca a ZZZZ
esempio:
0001
0002
..
..
9999
A000
A001
A999
..
..
Z999
..
..
AA00
AA01
etc.. ZZZZ
qualche idea su come procedere?
un saluto!
Ciao a tutti!
ho bisogno di creare un contatore alfanumerico di 4 digit che parta da 0000 e finisca a ZZZZ
esempio:
0001
0002
..
..
9999
A000
A001
A999
..
..
Z999
..
..
AA00
AA01
etc.. ZZZZ
qualche idea su come procedere?
un saluto!
Ciao,
ti crei una classe contatore che ha una variabile membro contatore e un metodo getNextCount() che ti restituisce il valore incrementato di uno.
Naturalemnte avrai un metodo privato getNextDigit che si occupa di calcolare la progressione dei digit con le regole he ti servono (cioè dopo il 9 vine A e dopo Z viene 0)
più o meno così (poi ottimizzazioni e i controlli sui limiti te li fai tu):
quando la vuoi usare fai semplicemente:Codice PHP:
class Contatore4Digit
{
var $m_contatore;
function __construct($lStart = '0000')
{
$this->m_contatore = $lStart;
}
public function getNextCount()
{
$next0 = false;
$next1 = false;
$next2 = false;
$next3 = false;
if ($this->m_contatore[3] == 'Z')
{
$next2 = true;
if ($this->m_contatore[2] == 'Z')
{
$next1 = true;
if ($this->m_contatore[1] == 'Z')
{
$next0 = true;
if ($this->m_contatore[0] == 'Z')
$next3 = true;
}
}
}
$this->m_contatore[3] = $this->getNextDigit($this->m_contatore[3]);
if ($next1)
$this->m_contatore[1] = $this->getNextDigit($this->m_contatore[1]);
if ($next2)
$this->m_contatore[2] = $this->getNextDigit($this->m_contatore[2]);
if ($next0)
$this->m_contatore[0] = $this->getNextDigit($this->m_contatore[0]);
return $this->m_contatore;
}
private function getNextDigit($str)
{
$ascii = ord($str);
if ($str == '9')
$ascii = 65;
else if ($str == 'Z')
$ascii = 48;
else
$ascii++;
return chr($ascii);
}
}
Codice PHP:
$cont = new Contatore4Digit('ZZWW'); //imposti il valore di partenza, se lasci vuoto si imposta a '0000';
for ($i=0; $i<200;$i++)
{
echo '
';
echo $cont->getNextCount(); //prendi il valore successivo
}
EDIT:
ovviamente base_convert suggerita da Raven è più performante e più semplice![]()
![]()
comunque a rigor di logica le tuo esempio dopo 9999 viene 999ACodice PHP:
for ($i=0; $i < 1679616; $i++)
echo base_convert($i, 10, 36);
A000 viene dopo 9ZZZ
Ma non dovrebbe essere così? Altrimenti sembra che vuoi le prima 10mila combinazioni numeriche e poi alfanumeriche, e la A deve iniziare dalle unità non dalle migliaia.Originariamente inviato da chaosgate82
Ciao a tutti!
ho bisogno di creare un contatore alfanumerico di 4 digit che parta da 0000 e finisca a ZZZZ
esempio:
0001
0002
..
..
9999
A000
A001
A999
..
..
Z999
..
..
AA00
AA01
etc.. ZZZZ
qualche idea su come procedere?
un saluto!
0001
0002
..
000A
...
000Z
0010
...
ZZZZ
ecco una versione più completa
edit: avevo sbagliato a contare le combinazioni. Ora ho corretto, scusateCodice PHP:
$max = 1000; // la stringa ZZZZ equivale all'intero 1679615. Sono più di 1 milione di numeri! sicuro di volerli contare tutti?
for ($i=0; $i <= $max; $i++)
{
$counter = base_convert($i, 10, 36); // converto la base
$counter = sprintf("%04s", $counter); // aggiungo gli zeri davanti
$counter = strtoupper($counter); // converto in maiuscolo
echo $counter;
echo "
";
}
Si hai ragione! mi va benissimo che dopo 0009 ci sia 000A,Originariamente inviato da bode
Ma non dovrebbe essere così? Altrimenti sembra che vuoi le prima 10mila combinazioni numeriche e poi alfanumeriche, e la A deve iniziare dalle unità non dalle migliaia.
0001
0002
..
000A
...
000Z
0010
...
ZZZZ
Vi ringrazio moltissimo, sia philbert per la versione estesa, che raven74 utilizzando la base_convert (mi mancava)
le due versioni producono lo stesso output, avete centrato perfettamente il mio problema, grazie mille e buon lavoro!