¿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_filter
etc, 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_filter
en este sentido podría hacerse mejor con funciones de cadena o reg-exRespuestas:
Paso 1: convierta la cadena en una matriz usando la
str_split
funció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_split
fuente
str_split() will split into bytes, rather than characters when dealing with a multi-byte encoded string.
- Entoncesstr_split
no 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_split
con/u
modificadorDe los comentarios en la documentación de php:
fuente
mb_split
es 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
1000000
tiempos conduce a estos resultados de evaluación comparativa:Usando cadena [i]
0.24960017204285 Seconds
Usando str_split
0.18720006942749 Seconds
Lo 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:
abcdef
Direccion contraria:
Salidas:
fedcba
fuente
fuente
¡La mayoría de las respuestas se olvidaron de los caracteres no ingleses!
strlen
cuenta 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-8
Esto salidas
fuente