Existe uma boa maneira de iterar os caracteres de uma string? Eu gostaria de ser capaz de fazer foreach
, array_map
, array_walk
, array_filter
etc, sobre os caracteres de uma string.
O tipo casting / juggling não me levou a lugar nenhum (coloque a string inteira como um elemento do array), e a melhor solução que encontrei é simplesmente usar um loop for para construir o array. Parece que deveria haver algo melhor. Quer dizer, se você pode indexar nele, não deveria ser capaz de iterar também?
Este é o melhor que eu tenho
function stringToArray($s)
{
$r = array();
for($i=0; $i<strlen($s); $i++)
$r[$i] = $s[$i];
return $r;
}
$s1 = "textasstringwoohoo";
$arr = stringToArray($s1); //$arr now has character array
$ascval = array_map('ord', $arr); //so i can do stuff like this
$foreach ($arr as $curChar) {....}
$evenAsciiOnly = array_filter( function($x) {return ord($x) % 2 === 0;}, $arr);
Existe algum:
A) Uma maneira de tornar a string iterável
B) Uma maneira melhor de construir a matriz de caracteres a partir da string (e em caso afirmativo, que tal a outra direção?)
Eu sinto que estou perdendo algo óbvio aqui.
php
string
character-arrays
jon_darkstar
fonte
fonte
array_filter
neste sentido poderia ser melhor realizada com funções de string ou reg-exRespostas:
Etapa 1: converta a string em uma matriz usando a
str_split
função$array = str_split($your_string);
Etapa 2: percorrer a matriz recém-criada
Você pode verificar os documentos do PHP para obter mais informações:
str_split
fonte
str_split() will split into bytes, rather than characters when dealing with a multi-byte encoded string.
- Entãostr_split
não posso trabalhar com UnicodeIterar string:
fonte
strlen()
em cada iteração. Não é uma coisa terrível, já que o PHP tem o comprimento pré-calculado, mas ainda é uma chamada de função. Se você precisa de velocidade, é melhor salvar isso em uma variável antes de iniciar o loop.Se suas strings estão em Unicode, você deve usar
preg_split
com/u
modificadorDos comentários na documentação php:
fonte
mb_split
é mais confiável.Você também pode simplesmente acessar $ s1 como um array, se você só precisar acessá-lo:
fonte
Expandido da resposta @SeaBrightSystems, você pode tentar isto:
fonte
Para aqueles que estão procurando a maneira mais rápida de iterar strings em php, preparei um teste de benchmark.
O primeiro método no qual você acessa caracteres de string diretamente especificando sua posição entre colchetes e tratando a string como uma matriz:
Eu mesmo pensei que o último é o método mais rápido, mas me enganei.
Tal como acontece com o segundo método (que é usado na resposta aceita):
Este método será mais rápido porque estamos usando um array real e não presumindo que seja um array.
Chamando a última linha de cada um dos métodos acima para
1000000
tempos leva a estes resultados de comparação:Usando string [i]
0.24960017204285 Seconds
Usando str_split
0.18720006942749 Seconds
O que significa que o segundo método é muito mais rápido.
fonte
Hmm ... Não há necessidade de complicar as coisas. O básico sempre funciona bem.
Direção para frente:
Saídas:
abcdef
Direção oposta:
Saídas:
fedcba
fonte
fonte
A maioria das respostas se esqueceu de caracteres não ingleses !!!
strlen
conta BYTES, não caracteres, é por isso que funciona e suas funções irmãs funcionam bem com caracteres ingleses, porque os caracteres ingleses são armazenados em 1 byte nas codificações UTF-8 e ASCII, você precisa usar as funções de string multibytemb_*
Isso funcionará com qualquer caractere codificado em
UTF-8
Isso resulta
fonte