Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

guhfloripa

tirar elementos repetidos dentro de um vetor?

Recommended Posts

Oi pessoal estou com duvida, eu estou pegando um arquivo.txt e estou colocando ele em um vetor, ai eu pego e uso uma função para localizar os repetidos e retirar do vetor, porém esta minha função esta muito lenta, alguem sabe como fazer isto do melhor jeito?

Preciso do melhor jeito porque o vetor vai possuir 100 mil posições. =/

obrigado desde ja agradecido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi pessoal estou com duvida, eu estou pegando um arquivo.txt e estou colocando ele em um vetor, ai eu pego e uso uma função para localizar os repetidos e retirar do vetor, porém esta minha função esta muito lenta, alguem sabe como fazer isto do melhor jeito?

 

Bom, primeiro respondendo de fato a dúvida:

$lista = array( "item1" , "item" , "outro" , "item" , "teste" , "item1" , "neto" , "mais um" );

printf( "Lista completa\n" );
var_dump( $lista );

printf( "Lista sem repetidos\n" );
var_dump( array_unique( $lista ) ); //array_unique retira todos os itens duplicados da matriz

A saída será:

Lista completa
array(8) {
  [0]=>
  string(5) "item1"
  [1]=>
  string(4) "item"
  [2]=>
  string(5) "outro"
  [3]=>
  string(4) "item"
  [4]=>
  string(5) "teste"
  [5]=>
  string(5) "item1"
  [6]=>
  string(4) "neto"
  [7]=>
  string(7) "mais um"
}
Lista sem repetidos
array(6) {
  [0]=>
  string(5) "item1"
  [1]=>
  string(4) "item"
  [2]=>
  string(5) "outro"
  [4]=>
  string(5) "teste"
  [6]=>
  string(4) "neto"
  [7]=>
  string(7) "mais um"
}

Porém, no seu caso específico, fazer isso é o mesmo que subir pelas escadas um prédio de 100 andares para só então descer pelo elevador até o 15 andar.

Uma vez que você já está processando um arquivo, você pode inserir apenas os itens que ainda não existem na matriz, evitando um novo processamento.

 

Imagina um arquivo teste.txt com o conteúdo:

item1
item
outro
item
teste
item1
neto
mais um

Para lermos o arquivo e inserir na matriz apenas itens únicos utilizamos uma matriz associativa auxiliar e com ajuda do isset saberemos se o item

já existe ou não.

$matriz = array();
$auxiliar = array();

if ( ( $fh = fopen( "teste.txt" , "r" ) ) ){
    while ( ( $line = fgets( $fh , 256 ) ) ){
        /**
         * Essa linha é só para remover a quebra de linha do item atual
         */
        $line = preg_replace( "/(\\r\\n|\\r|\\n)/" , "" , $line );

        /**
         * Verificamos se o item atual não está na nossa matriz associativa, se tiver ignoramos
         */
        if ( !isset( $auxiliar[ $line ] ) ){
            $matriz[] = $line;
            $auxiliar[ $line ] = 1;
        }
    }

    fclose( $fh );
}

/**
 * Não precisamos mais da matriz auxiliar
 */
unset( $auxiliar );
var_dump( $matriz );

A saída será:

 

array(6) {
  [0]=>
  string(5) "item1"
  [1]=>
  string(4) "item"
  [2]=>
  string(5) "outro"
  [3]=>
  string(5) "teste"
  [4]=>
  string(4) "neto"
  [5]=>
  string(7) "mais um"
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

array_unique.

http://br.php.net/manual/en/function.array-unique.php. Se não funcionar, olha no book do array que vai ter alguma função que te ajude.

http://br.php.net/manual/en/book.array.php

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.