Jump to content

Archived

This topic is now archived and is closed to further replies.

Tiago Souza Ribeiro

Remover caracteres repetidos

Recommended Posts

Olá. A dúvida da vez é a seguinte:

Tenho uma string: "abracadabra".

Como faço para remover os caracteres repetidos deixando apenas um?

No caso dessa string, o valor retornado deveria ser o seguinte: "abrcd". Removeu as repetições, não importando se são consecutivas ou não.

Obs1: não há como saber quais caracteres vão repetir

Obs2: não há como saber quantas vezes o caractere vai repetir

Já achei um método alí, mas precisa transformar a string em array, remover as duplicatas, e converter para string novamente.

Há alguma forma mais rápida e direta?

 

Obrigado pela atenção.

Até mais.

Share this post


Link to post
Share on other sites

Cara pensei em algo assim :

 

 

<?php

$str = "sssrrrry";

$v = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "y", "z");


for($i = 0; $i < 25; $i++){

$quant = substr_count($str, $v[$i]);

$cont[] = $quant;

}

rsort($cont);

if($cont[0] > 1){

echo "Houve ". $cont[0] ." duplicações de somente 1 caractere na string";

}



?>

 

Passei um tempinho para pensar mais ta ai .

Share this post


Link to post
Share on other sites

@Daniel_Moraes, está muito complicado e com algumas coisas que podem ser substituídas, não ?

Vejamos, primeiramente o sua variável v contendo os caracteres, pode ser substituído por:

$v = range ( 'a' , 'z' ) ;

Outra coisa é esse loop, a questão não é contar quantos caracteres duplicados existem, e sim remove-los, se for contar, é simples ... pode se utilizar o array_count_values junto com o str_split.

 

Exemplo :seta:

<?php
      $string = 'aabbccddeeffghi' ;
      $chars = str_split ( $string , 1 ) ;

      var_dump ( $chars ) ;

      echo PHP_EOL , '- Duplicados: ' , PHP_EOL ;

      var_dump ( array_count_values ( $chars ) ) ;

      echo PHP_EOL , 'String ...' , PHP_EOL ;

      echo join ( array_unique ( $chars ) ) ;

 

Saída

 

array (size=15)
 0 => string 'a' (length=1)
 1 => string 'a' (length=1)
 2 => string 'b' (length=1)
 3 => string 'b' (length=1)
 4 => string 'c' (length=1)
 5 => string 'c' (length=1)
 6 => string 'd' (length=1)
 7 => string 'd' (length=1)
 8 => string 'e' (length=1)
 9 => string 'e' (length=1)
 10 => string 'f' (length=1)
 11 => string 'f' (length=1)
 12 => string 'g' (length=1)
 13 => string 'h' (length=1)
 14 => string 'i' (length=1)

- Duplicados:

array (size=9)
 'a' => int 2
 'b' => int 2
 'c' => int 2
 'd' => int 2
 'e' => int 2
 'f' => int 2
 'g' => int 1
 'h' => int 1
 'i' => int 1

String ... abcdefghi

 

;)

Share this post


Link to post
Share on other sites

Eu tambêm pensei em usar o range mais tentei fazer do jeito que ele entenderia melhor, e ele não queria conveter uma string em array como ele diz:

"Já achei um método alí, mas precisa transformar a string em array, remover as duplicatas, e converter para string novamente.", mais muito obrigado .

Share this post


Link to post
Share on other sites

Mas o desafio é fazer sem ter de converter a string em array, e pior: não se trata de tirar repetições, pois aí se poderia usar preg_replace e susbstituir a repetição por um único caractere usando 'retrovisor' (os caracteres repetidos podem estar em qualquer lugar), mas sim de retornar apenas os caracteres únicos/distintos. Infelizmente não existe uma função que faça com strings o mesmo que array_unique faz com arrays, então creio que a única maneira é fazer isso convertendo a string em array, removendo os repetidos e convertendo novamente em string.

 

$str = "abracadabra";
$dst = implode("", array_unique(str_split($str)));
echo $dst; // abrcd

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.