Ser Programador

Entendendo como trabalhar com array no ColdFusion

Arrays no Adobe ColdFusion são um tanto singulares comparado aos arrays de demais linguagens. Vamos entender seu funcionamento.


A estranheza dos arrays no ColdFusion já começa quando o primeiro item do array está na posição de índice 1, diferente das demais principais linguagens de progração do mercado nas quais o primeiro índice do array começa em zero.


É muito comum, quando somos novos no ColdFusion e já temos alguma experiência em demais linguagens, fazermos um loop for em um array passando o índice zero como inicial, por exemplo. Neste caso você teria um erro parecido com: The element at position 0 of dimension 1, of array variable cannot be found.


Vamos então instanciar nosso array. Se já sabemos quais dados estarão em nosso array, podemos instancia-lo assim:

		<cfset cores = ['vermelho', 'azul', 'verde']>
	

Como está mais claro que a luz do dia, criamos um array de cores contendo três cores inicialmente.


Podemos adicionar dados neste array fazendo uso da função arrayAppend:

		<cfset cores = ['vermelho', 'azul', 'verde']>
		<cfset arrayAppend(cores, 'ciano')>
	

Como podemos ver, a função arrayAppend recebe no primeiro parâmetro o array que receberá o novo valor, e como segundo parâmetro, o próprio valor a ser adicionado.


O mesmo efeito podemos obter simplesmente alimentando manualmente o índice do array:

		<cfset cores = ['vermelho', 'azul', 'verde']>
		<cfset arrayAppend(cores, 'ciano')>
		<cfset cores[ArrayLen(cores)+1] = 'amarelo'>
	

Utilizamos a função ArrayLen para obter quantos itens existem em nosso array;

Como o primeiro índice dos arrays no ColdFusion começam em 1, devemos somar com 1 o resultado da função ArrayLen para chegar no valor do novo índice desse array;


Para instanciar um array vazio, no caso de popularmos esse array a partir do resultado de outros procedimentos, podemos usar a forma no primeiro exemplo, ou também a função ArrayNew:

		<cfset coresAntigas = []>
		<cfset coresNovas = ArrayNew(1)>
	

Utilizamos a função ArrayNew para criar um novo array, fornecendo 1 como parâmetro para informar que nosso array terá 1 dimensão;

Tecnicamente usar a função ArrayNew com uma dimensão para criar um array e tratá-lo como array de múltiplas dimensões não causa erros de código. Portanto pode-se começar usando ArrayNew(1) e conforme a necessidade guardar outros arrays dentro deste, tranquilamente, de acordo com a necessidade;

Se utilizar ArrayNew(2) para criar um array de duas dimensões você obrigatoriamente precisará trabalhar com arrays no segundo nível. Iniciando com uma só dimensão, você fica livre para trabalhar com o formato dos itens do segundo nível da forma que preferir;

Creio eu que essa disparidade entre instanciar um array com ArrayNew(1) e ArrayNew(2) deva-se à forte tipagem do Java, uma vez que o ColdFusion é quase que um Framework de desenvolvimento Java. Mas isso é sómente minha forma de entender, posso estar errado quanto a isso.


Você pode criar estruturas multidimensionais com arrays, simplemente trabalhando manualmente os índices do array. Vejamos:

		<cfset carrosDisponiveis = ArrayNew(1)>

		<cfset indiceCarro1 = ArrayLen(carrosDisponiveis)+1>
		<cfset carrosDisponiveis[indiceCarro1]['modelo'] = 'Viper GTS'>
		<cfset carrosDisponiveis[indiceCarro1]['cor'] = 'Branco'>
		<cfset carrosDisponiveis[indiceCarro1]['aro'] = 20>
		<cfset carrosDisponiveis[indiceCarro1]['potenciaCV'] = 550>

		<cfset indiceCarro2 = ArrayLen(carrosDisponiveis)+1>
		<cfset carrosDisponiveis[indiceCarro2]['modelo'] = 'Nissan GTR'>
		<cfset carrosDisponiveis[indiceCarro2]['cor'] = 'Azul Indigo'>
		<cfset carrosDisponiveis[indiceCarro2]['aro'] = 20>
		<cfset carrosDisponiveis[indiceCarro2]['potenciaCV'] = 600>
	

Nas linhas 3 e 9, utilizamos ArrayLen()+1 para encontrar o índice do primeiro nível do array de cada ítem que estamos criando, e guardamos esse índice na variável indiceCarro (acompanhada do número do item do array);

Nas linhas 4 a 7, e 10 a 13, utilizamos a variável indiceCarro para criar o "segundo" nível do nosso array. Digo "segundo" entre aspas, pois como estamos trabalhando com índices associativos (não numéricos), o ColdFusion trata isso como uma Struct;


Este exemplo acima tem utilidade quando você precisa configurar uma lista fixa manualmente, contendo informações que seu script utilizará.

Por exemplo, em uma página onde você precise criar filtros baseado em informações fixas, você pode criar os selects de formulário HTML com um loop que percorre o array carrosDisponiveis para obter os dados que serão inseridos nos options do select. Assim você pode criar filtros de Modelo e Cor, por exemplo.

Claro que "carros" é um exemplo hipotético. Normalmente utiliza-se uma busca no banco de dados para obter os dados, e com um loop no resultado da query, constrói-se os selects de formulário HTML. Porém há casos em que temos filtros específicos onde os dados são fixos e não são resgatados do banco de dados. Nestas hipóteses a abordagem acima pode ser uma opção, dependendo da regra de negócio do seu sistema.


Se estiver interessado sobre como percorrer arrays com laços de repetição no ColdFusion dê uma olhada NESTE ARTIGO.