Postagem em destaque

Criando bot do Telegram em Shell script com ShellBot

Reindexando os elementos de um array

Resumo

Um array é uma estrutura de dados que armazena uma coleção de elementos de tal forma que cada um dos elementos possa ser identificado por, pelo menos, um índice ou uma chave. 

Veja também: Expansão de arrays

Sempre que um array é instanciado e os valores dos elementos atribuindo, cada elemento recebe seu índice referencial, indicando sua posição dentro dele. Porém quando um elemento é deletado ou seu valor definido como nulo, seu índice não é reutilizado a menos que seja explicitamente declarado. 


Na prática

Para melhor entendimento irei inicializar um array
# Inicializando o array
$ nomes=('adriana' 'leticia' 'maria' 'lucas' 'fernando')

# Imprimindo todos os elementos.
$ echo ${nomes[@]}
adriana leticia maria lucas fernando
 
# Imprimindo os índices
$ echo ${!nomes[@]}
0 1 2 3 4
Note que todos os elementos foram armazenados em seus respectivos índices, iniciando a partir do índice 0 (zero).

Para realizar o teste vou apagar o penúltimo elemento ('lucas') do array e salvar um novo para verificar em qual índice será salvo.

# Apagando o elemento 'lucas'.
$ unset nomes[3]

# Incrementando o array com o novo elemento.
$ nomes+=('jessica')
 
# Imprimindo novamente todos os elementos do array com o novo item salvo.
$ echo ${nomes[@]}
adriana leticia maria fernando jessica
 
# Listando todos os índices.
$ echo ${!nomes[@]}
0 1 2 4 5
Como esperado o novo elemento foi salvo no último índice (fim da fila), mesmo com o índice três disponível. Porque os elementos do array são incrementados em uma ordem sequencial a partir do último índice do array + 1, exceto se o índice for especificado.

Solução

A resolução é bastante simples. O que precisamos é reinicializar o array atribuindo os elementos armazenados no mesmo e consequentemente criando uma nova reindexação. 

Como eu faço isso ?

Veja o exemplo:
# Inicializando o array
$ nomes=('adriana' 'leticia' 'maria' 'lucas' 'fernando')

# Deletando o elemento 'lucas'
$ unset nomes[3]

# ------------- DICA -----------
# Reinicializando o array atribuindo com seus próprios elementos
$ nomes=(${nomes[@]})

# Incrementando o array com o novo elemento
$ nomes+=('jessica')
# ------------------------------
 
# Imprimindo todos os elementos
$ echo ${nomes[@]}
adriana leticia maria fernando jessica

# Listando os índices
$ echo ${!nomes[@]}
0 1 2 3 4
Note que os índices dos elementos seguem um padrão numericamente sequencial, não havendo intervalos entre eles.

Nota: É absolutamente necessário reinicializar o array antes de incrementar o novo elemento. Em caso de possuir elementos com valores compostos (com espaçamento), utilize aspas duplas. 

Exemplo: array=("${array[@]}")

Comentários

Contato

Nome

E-mail *

Mensagem *