¿Existe una buena forma de iterar sobre los caracteres de una cadena? Me gustaría ser capaz de hacer foreach, array_map, array_walk, array_filteretc, sobre los caracteres de una cadena.
La conversión de tipos / malabares no me llevó a ninguna parte (coloque la cadena completa como un elemento de la matriz), y la mejor solución que he encontrado es simplemente usar un bucle for para construir la matriz. Parece que debería haber algo mejor. Quiero decir, si puedes indexarlo, ¿no deberías poder iterar también?
Esto es lo mejor que tengo
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);
¿Hay alguno:
A) Una forma de hacer que la cadena sea iterable
B) Una mejor manera de construir la matriz de caracteres a partir de la cadena (y si es así, ¿qué tal la otra dirección?)
Siento que me estoy perdiendo algo obvio aquí.
fuente

array_filteren este sentido podría hacerse mejor con funciones de cadena o reg-exRespuestas:
Paso 1: convierta la cadena en una matriz usando la
str_splitfunción$array = str_split($your_string);Paso 2: recorrer la matriz recién creada
Puede consultar los documentos de PHP para obtener más información:
str_splitfuente
str_split() will split into bytes, rather than characters when dealing with a multi-byte encoded string.- Entoncesstr_splitno puedo trabajar con UnicodeIterar cadena:
fuente
strlen()a cada iteración. No es algo terrible, ya que PHP tiene la longitud precalculada, pero sigue siendo una llamada de función. Si necesita velocidad, mejor guárdelo en una variable antes de iniciar el ciclo.Si sus cadenas están en Unicode, debe usar
preg_splitcon/umodificadorDe los comentarios en la documentación de php:
fuente
mb_splites más confiable.También puede acceder a $ s1 como una matriz, si solo necesita acceder a él:
fuente
Ampliado de la respuesta de @SeaBrightSystems, puedes probar esto:
fuente
Para aquellos que buscan la forma más rápida de iterar sobre cadenas en php, he preparado una prueba de referencia.
El primer método en el que accede a caracteres de cadena directamente especificando su posición entre paréntesis y tratando la cadena como una matriz:
Yo mismo pensé que este último es el método más rápido, pero estaba equivocado.
Al igual que con el segundo método (que se usa en la respuesta aceptada):
Este método será más rápido porque estamos usando una matriz real y no asumimos que una sea una matriz.
Llamar a la última línea de cada uno de los métodos anteriores para los
1000000tiempos conduce a estos resultados de evaluación comparativa:Usando cadena [i]
0.24960017204285 SecondsUsando str_split
0.18720006942749 SecondsLo que significa que el segundo método es mucho más rápido.
fuente
Hmm ... No hay necesidad de complicar las cosas. Lo básico siempre funciona muy bien.
Dirección de avance:
Salidas:
abcdefDireccion contraria:
Salidas:
fedcbafuente
fuente
¡La mayoría de las respuestas se olvidaron de los caracteres no ingleses!
strlencuenta BYTES, no caracteres, por eso es así y sus funciones hermanas funcionan bien con caracteres en inglés, porque los caracteres en inglés se almacenan en 1 byte en codificaciones UTF-8 y ASCII, necesita usar las funciones de cadena multibytemb_*Esto funcionará con cualquier carácter codificado en
UTF-8Esto salidas
fuente