Lógica avançada para auto incremento com letras no lugar de números

1,013 views
Skip to first unread message

Pablo Augusto

unread,
May 6, 2009, 9:32:55 PM5/6/09
to php...@yahoogrupos.com.br, php-b...@googlegroups.com, phpri...@googlegroups.com, php...@yahoogrupos.com.br, php-espe...@yahoogrupos.com.br, phpav...@googlegroups.com
Boa noite,

estou desenvolvendo uma classe em php que tem verificar o último conjunto de letras, e incrementar em um.
Explicando melhor

TB_X         
--------------------
- sequencia  -
--------------------
aaa
aab
aac
aad
...
aBa
aBb
aBc
...
kb1
kb2
...
999
aaaa
aaab
aaac
...
9999
aaaaa
aaaaab
etc

Ou seja, ele verifica os caracteres [a -z] [A - Z] [0 - 9] nessa ordem
e sempre vai incrementando um.
Caso todos sejam o mais alto permitido ele aumenta uma casa e começa
de novo com o menor caractere "a".

Estou tentando mas estou tendo algumas dificuldades da parte de adicionar
dinamicamente mais uma casa quando chega em 999 (teria de pular para "aaaa")

Alguém já fez algo semelhante ou tem alguma ideia de como proceder?

Waldson

unread,
May 7, 2009, 9:27:12 AM5/7/09
to php-brasil
Ih eu já precisei disso e fiz uma lógica muito complicada...



Mas eu descobri de modo empírico um jeito bastante simples e depois eu
encontrei na net também:

voce pode usar letra no for e voce pode incrementar letra também:

//use o $i pra ter o controle númerico caso não precise use apenas o
$j
for($i = 0,$j = 'a';$i < 10000;$i++, $j++) {
echo $j . '<br />';
}

ou:
$ultimoRegistro = 'aaaaa';
echo ++$ultimoRegistro;

vai escrever aaaab

Pablo Augusto

unread,
May 7, 2009, 1:32:48 PM5/7/09
to php-b...@googlegroups.com
Poxa, achei fantático =) muito bom mesmo.
Fiz alguns testes e infelizmente para esse caso não serve,
pois quando chega em 999 ele pula para 1000 e não para aaa.

Uma pena. Mas ótima dica, muito obrigado.

2009/5/7 Waldson <waldi...@hotmail.com>

Luiz Escobar

unread,
May 7, 2009, 2:35:55 PM5/7/09
to php-b...@googlegroups.com
Pera ai, se fez ir de ´a´ até ´999´ ???
ou se ja começa em ´aaa´ e ai em ´999´ não vai para ´aaaa´ ??
Se tive-se sua rotina seria mais facil achar o erro né....

vou fazer a lógica:
$comp := Lenght( $RegistroAtual )
gera $UltimoRegistro de $comp só com '9'
$RegistroAtual == $UltimoRegistro - São iguais ???
aumenta 1 em $comp e gera a string de retorno do comprimento de $comp só com
'a' e retorna ela;
caso contrario executa sua rotina de incremento que ja esta pronta pelo que
entendi...
[]s


Luiz Escobar - http://www.megasistema.com.br
============================================
Harbour 1.1.0dev(Rev.10854) (DbfNtx+MySQL)
MiniGUI 1.6 Extended (Build 65)-2009.04.15
--------------------------------------------
XAMPP 1.7.0 (Apache+MySQL+PHP+(Linux/Win))
FLEX 3.0 (iniciante)
--------------------------------------------
Delphi ( 6 PRO & 7 Ent ) (DBF/NTX+MySQL)
============================================


--------------------------------------------------
From: "Waldson" <waldi...@hotmail.com>
Sent: Thursday, May 07, 2009 10:27 AM
To: "php-brasil" <php-b...@googlegroups.com>
Subject: [PHP-BRASIL - 2.0] Re: Lógica avançada para auto incremento com
letras no lugar de números

Pablo Augusto

unread,
May 7, 2009, 3:34:06 PM5/7/09
to php-b...@googlegroups.com
Amigo,

Se parar para ler o tópico vai ver que já está resolvido, a lógica e o algoritmo já foram postados funcionando 100%.
Inclusive explico que minha necessidade é começar com aaa->aab->...AAZ->AA0->...AA9->ABa-> etc
e quando chegar em depois de ZZZ viria 000 -> 999.
Quando chegar em 999 tem de voltar para o primeiro caracter acrescentando um 999->aaaa

Mas como disse, tudo já foi explicado, resolvido e postado a cima.
Leia e encontrará a solução.

Grande abraço.


2009/5/7 Luiz Escobar <esc...@megasistema.com.br>

poste9

unread,
May 7, 2009, 4:02:32 PM5/7/09
to php-b...@googlegroups.com
cara, caso haja alguma duvida vou dizer oq eu sei...

a algum tempo atras houve uma challenge pra codar esse algorirmo

pra achar os resultados procura no google: mirc scripting inctext

tem umas 20
maneiras de se fazer isso. Bom, espero q ajude

Em 07/05/09, Pablo Augusto<em...@pabloaugusto.com> escreveu:
--
New blog post: UTM JavaScript Library, trabalhando com classes
http://tinyurl.com/5dvasg
=============================================================
New blog post: Desenvolvimento Ágil, construindo um gerador de
classes. http://tinyurl.com/64xa2h
=============================================================
Vox Tecnologia & Grupo Comunidade de Comunicação
Rafael Lúcio 29809.099333,
http://www.postenove.com.br

Pablo Augusto

unread,
May 7, 2009, 4:13:49 PM5/7/09
to php-b...@googlegroups.com
Valeu mesmo,
vou dar uma procurada, quem sabe não mais rápido e/ou eficiente do que esse que já foi postado.
Se achar faço uns testes e posto o resultado.

2009/5/7 poste9 <pos...@gmail.com>
mirc scripting inctext

Rafael Eduardo Kassner

unread,
May 7, 2009, 2:17:49 PM5/7/09
to php-b...@googlegroups.com
Pablo

Veja se isso te serve.
Anexo.

Valeu!

2009/5/7 Pablo Augusto <em...@pabloaugusto.com>



--
Rafael Eduardo Kassner
http://www.kassner.com.br
+55 47 9992-9170
str.php

Rafael Eduardo Kassner

unread,
May 7, 2009, 2:25:33 PM5/7/09
to php-b...@googlegroups.com
Melhorei.
A transição entre 99 para aaa estava dando problemas...
Anexo.

2009/5/7 Rafael Eduardo Kassner <kas...@gmail.com>
str.php

Ninetails - Carlos Kazuo

unread,
May 7, 2009, 9:03:59 PM5/7/09
to php-b...@googlegroups.com
Imaginei 2 modos:

1) Mudança de base a partir de um número decimal
http://pastebin.com/m720048b8
(desde que seja um inteiro válido =\ e este vc precisaria ter algum
número índice)

2) Trocando o último (ou ultimos) 'algarismos'
http://pastebin.com/m7a46bf97

--------------------------------------------------
Carlos Kazuo - Ninetails
ninetails.nine [at] gmail.com

Vinicius Rezende

unread,
May 7, 2009, 11:08:52 PM5/7/09
to php-b...@googlegroups.com
Esquema bruteforce, poe num array os caracteres 0-9 a-z A-Z, aí você vê se i é > que array.length, caso seja pegue a divisão inteira por array.length, caso contrario retorne array[i]

2009/5/7 Ninetails - Carlos Kazuo <ninetai...@gmail.com>

felipebastos

unread,
May 11, 2009, 5:36:30 PM5/11/09
to php-brasil
Pablo .. a única utilização dessa metodologia de indexação que está na
moda atualmente é para encurtador de urls .. é esse o objetivo da
implementação desse algoritmo ??
.
mesmo que não seja esse o objetivo vou explicar como se fosse esse.
.
vc nunca trabalhará em incremento de string na vida real .. nem mesmo
sites como tinyurl fazem isso .. e por que ? os códigos entendíveis do
ascii não estão na sequencia que costumamos usar. Mas como o tinyurl
reconhece os endereços:
tinyurl.com/a
tinyurl.com/b
tinyurl.com/c
tinyurl.com/d
tinyurl.com/abcde
...
é simples, se 1 for a, 2 será b, 3 será c, e assim por diante até que
chegue em Z igual a 54.
tendo um array como o que segue ..
.
array("a"=>1, ...,"z"=>27, ..., "a"=>28, ..., "Z"=>54);
.
vc facilmente fará a conversão de inteiro para string e de string para
inteiro ..
.
mas vc não tem no array o índice "aaaa" .. correto, não tenho, mas com
algumas operações matemáticas é possível obtê-lo.
.
Como o alfabeto tem 27 caracteres, e são maiusculas e minusculas,
então o novo alfabeto terá 54 caracteres. correto ?
.
então, basta fazer a conversão usando a base 54 e pronto. A lógica é a
mesma da conversão de hexadecimal para decimal, de binário para
decimal e etc .. basta converter o número na base 54 o número na base
10, e em seguida para os caracteres do array padrão .. que terá 54
indices :D
.
o mesmo algoritmo explicado serve pra qualquer outra utilidade que
possa achar na indexação literal.

Rafael Eduardo Kassner

unread,
May 12, 2009, 8:05:19 AM5/12/09
to php-b...@googlegroups.com
A idéia é por aí.
Só uma correção: o alfabeto brasileiro tem 26 letras (e é melhor desconsiderar qualquer caracter especial por motivos de codificação)

2009/5/11 felipebastos <feli...@gmail.com>

Aline Fernanda Paulino

unread,
May 12, 2009, 10:41:22 AM5/12/09
to php-b...@googlegroups.com
Tentou usar em  ASC II, vc pegah o valor em ASC e incrementa, mostrando o proximo valor
tem funçoes q converte e com o codigo c pode incrementah mostra o correspondente. Dependendo da sua aplicação pode ser util.
 
Att.
    Aline

Pablo Augusto

unread,
May 12, 2009, 2:26:50 PM5/12/09
to php-b...@googlegroups.com
Opa,

pessoal, leiam acima.
Já está resolvido, o primeiro algorítmo cai como uma luva.
Grande abraço a todos e obrigado pelas respostas.

2009/5/12 Aline Fernanda Paulino <sansan...@gmail.com>

Domingues

unread,
May 12, 2009, 5:22:39 PM5/12/09
to php-b...@googlegroups.com
Olá Pablo!

É que o caso ficou interessante, e o pessoal gosta de discutir possibilidades  :)  Sempre poderemos precisar de algumas variações e eles estão enriquecendo o post!  :)

Um abraço

Sergio Domingues

Pablo Augusto

unread,
May 12, 2009, 5:34:18 PM5/12/09
to php-b...@googlegroups.com
Eu havia entendido que não tinham lido la em cima
desculpe

2009/5/12 Domingues <tria...@gmail.com>

felipebastos

unread,
May 13, 2009, 10:58:14 AM5/13/09
to php-brasil
valeu rafael .. vc tem toda razão ..

quando falei 27 pensei "em 26 capitais mais o distrito federal" (27 ..
nada haver) .. na hora tava fazendo uma pesquisa sobre mapas
geográficos para uma amiga .. aí fiquei com o número na cabeça kk
(impressionante como 23 + 3 saltou para 27 :D)

então, corrigindo, 26 caracteres do alfabeto, 52 índices no array.

desculpem o deslize ...

o interessante nisso é o índice em si .. id = 99999999999 fica bem
menor com essa compactação graças a mudança de base do número

Pablo Augusto

unread,
May 13, 2009, 6:06:48 PM5/13/09
to php-b...@googlegroups.com
+ 10 numericos= [a-z] + [A-Z] + [0-9]

2009/5/13 felipebastos <feli...@gmail.com>
Reply all
Reply to author
Forward
0 new messages