Salve pessoal!
Em primeiro lugar, peço desculpas a todos os visitantes que acompanham os artigos aqui publicados, devido a demora da publicação de novos artigos. Meu tempo anda muito corrido em função dos projetos que estou desenvolvendo que graças a Deus estão cada vez mais próximos dos resultados desejados.
No artigo de hoje compartilharei com vocês um método em PHP criado por mim que ajudou a implementar um algoítimo de remoção de índices de um vetor e, em seguida, a reorganização dos índices a partir do índice que foi removido sem a necessidade de implementar complexos algorítimos de estrutura de dados como listas ou filas.
Este método pode ser adotado em divesas neessidades que utilizam vetores como: DataGrids, Carrinhos de Compra, Listagens entre outros. Usei este método para remover linhas de um DataGrid onde os dados estavam armazenados em um vetor dentro de uma sessão ($_SESSION). Para um melhor entendimento, explicarei a lógica do algoritimo, mostraremos o algoritimo do método criado, o código e por fim, um pequeno exemplo da utilização do método.
Lógica da remoção de um elemento do vetor
Temos o seguinte vetor denominado cores com 4 elementos como representa a figura abaixo:

Figura 1 - Representação do Vetor cores
Como mostrado na figura acima, o vetor cores contêm como elementos as cores vermelho, amarelo, verde e azul respetivamente. Suponhamos que eu quero remover a cor verde (posição 2 do vetor) e através de um código PHP eu elimine esta posição ( $cores[2] = “”;ou unset($cores[2]) ). De fato a remoção do valor será feita, porém acontecerá a seguinte situação como representada na figura abaixo:

Figura 2 - Vetor após a remoção da cor verde
Percebam que o valor foi removido porém, mesmo vazia, a posição que armazenava a cor verde ainda existe. Neste caso não teria algum problema, mas e se este vetor armazenasse valores dos ítens de pedido, por exemplo, além de consumir memória desnecessáriamente, não seria nada elegante exibir linhas vazias na listagem, ou no momento dentro do código do laço de repetição, fazer uma checagem se a determinada posição do vetor está vazia, o que também faria que o ciclo consumisse mais memória. A forma ideal de evitarmos estes problemas é, após a remoção do valor, resposicionar os valores seguintes a partir da posição do valor removido. Complicado? A figura abaixo representa esta última explicação:

Figura 3 - Vetor reorganizado após a remoção de elemento
Algoritimo
Para chegar ao resultado explicado acima, sem a necessidade de adotar complexos algoritimos de estrutura de dados, foram adotadas algumas funções do PHP específicas para manipular vetores. Abaixo as funções:
- array_splice() - Função para remover parte de um vetor (conforme o intervalo espeificado) e substitui com outros elementos;
- array_shift() - Função para remover o 1° índice do vetor;
- array_merge() - Função para fundir 1 ou mais vetores;
Voltando ao nosso exemplo do vetor cores, ao fazer a remoção da cor verde, o primeiro passo é dividir nosso vetor cores oem dois vetores temporários. O 1º vetor armazena as posições armazenadas antes da posição com a cor verde, enquanto o 2º armazena as posições posteriores à posição removida.

Figura 4 - Removendo índice do vetor e separando posições
Com os vetores separados, e a a posição com a cor verde removida definitivamente, basta unirmos os vetores separados e pronto!!! Observe a figura abaixo:

Figura 4 - Removendo índice do vetor e separando posições
Legal né!? O código-fonte abaixo faz exatamente esta sequềncia, porém com algumas peculiaridades relacionadas aos intervalos de índices.
Código-fonte
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /** * Método responsável em remover e reposicionar índices de um vetor dinâmicamente * * @return vetor * @author Felipe dos S. Assis - felipe@felipeassis.com.br * @since 15/02/2009 * @version 1.0 */ function removeIndice($vetor, $posicao) { $arrayTemp = $vetor; # Cria um array contendo os elementos antes do índice passado, caso o mesmo não seja o primeiro elemento if($posicao > 0) { $inicioArray = array_splice($vetor, 0, $posicao); } # Cria um array contendo os elementos após o índice passado. if($posicao > 1) { $fimArray = array_splice($vetor, $posicao - 1, sizeof($arrayTemp)); } elseif($posicao == 1) { $fimArray = array_splice($vetor, $posicao, sizeof($arrayTemp)); } // Faz, de fato a remoção do índice do Array. Caso o índice seja o primeiro elem if($posicao > 0) { $vetorFinal = array_merge($inicioArray, $fimArray); $vetor = $vetorFinal; } elseif ($posicao == 0) { $item = array_shift($arrayTemp); $vetor = $arrayTemp; } return $vetor; } |
Simples não? Percebam que as únicas informações necessárias para o método fazer a remoção do índice são o vetor a ser modificado e a posição que será removida. Vejam abaixo um código de exemplo utilizando o método removeIndice():
1 2 3 4 5 6 7 8 9 10 11 | # Um pequeno exemplo: Um array contendo cores $cores = array("vermelho", "verde", "azul", "amarelo"); print_r($cores); echo " "; # Estou removendo a cor azul $cores = removeIndice($cores, 2); # Resultado: A cor azul foi removida e os índices do array foram reorganizados print_r($cores); |
Beleza pessoal!? Utilizei a função removeIndice() em um projeto que necessitava deste recurso em uma listagem e resolveu bem. O código apresentado pode ser copiado e modificado livremente. Caso encontem algum problema, contribuam com um comentário, ok!?
É isso pessoal espero que tenham gostado e principalmente ajudado.
Abraços,
Fiquem com Deus
E até a próxima!

27 Junho 2010 as 11:26 AM
Parabéns pelo código, sou iniciante e me ajudou muito
abraço