Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
@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)
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
;)
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 .
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; // abrcdPois é, é com str_split e array_unique que funciona o método que não me agradou. Aumentou um tempo significativo na execução mas não tem jeito, é fazer assim mesmo...
Obrigado a todos que responderam :)
Cara pensei em algo assim :
Passei um tempinho para pensar mais ta ai .