primer - recorrer string php
PHP-iterar en caracteres de cadena (7)
¿Hay alguna buena manera de iterar sobre los caracteres de una cadena? Me gustaría poder hacer foreach
, array_map
, array_walk
, array_filter
etc. en los caracteres de una cadena.
El tipo de malabarismo / malabarismo no me llevó a ninguna parte (puse toda la cadena como un elemento de la matriz), y la mejor solución que he encontrado es simplemente usar un ciclo for para construir la matriz. Se siente como si hubiera algo mejor. Quiero decir, si puedes indexar, ¿no deberías poder iterar también?
Este es el 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 la cadena iterable
B) Una mejor manera de construir la matriz de caracteres a partir de la cadena (y si es así, ¿qué hay de la otra dirección?)
Siento que me falta algo obvio aquí.
Ampliado desde @SeaBrightSystems, puede intentar esto:
$s1 = "textasstringwoohoo";
$arr = str_split($s1); //$arr now has character array
Iterar cadena:
for ($i = 0; $i < strlen($str); $i++){
echo $str[$i];
}
Para aquellos que están buscando 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 directamente a los caracteres de cadena especificando su posición entre corchetes y tratando la cadena como una matriz:
$string = "a sample string for testing";
$char = $string[4] // equals to m
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):
$string = "a sample string for testing";
$string = str_split($string);
$char = $string[4] // equals to m
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 por 1000000
veces conduce a estos resultados de evaluación comparativa:
Usando una cuerda [i]
0.24960017204285 Seconds
Usando str_split
0.18720006942749 Seconds
Lo que significa que el segundo método es mucho más rápido.
Si sus cadenas están en Unicode, debe usar preg_split
con /u
modificador
De los comentarios en la documentación de php:
function mb_str_split( $string ) {
# Split at all position not after the start: ^
# and not before the end: $
return preg_split(''/(?<!^)(?!$)/u'', $string );
}
También puede acceder a $ s1 como una matriz, si solo necesita acceder a ella:
$s1 = "hello world";
echo $s1[0]; // -> h
Paso 1: convierte la cadena a una matriz usando la función str_split
$array = str_split($your_string);
Paso 2: recorre el conjunto recién creado
foreach ($array as $char) {
echo $char;
}
Puede consultar los documentos de PHP para obtener más información: str_split
// Unicode Codepoint Escape Syntax in PHP 7.0
$str = "cat!/u{1F431}";
// IIFE (Immediately Invoked Function Expression) in PHP 7.0
$gen = (function(string $str) {
for ($i = 0, $len = mb_strlen($str); $i < $len; ++$i) {
yield mb_substr($str, $i, 1);
}
})($str);
var_dump(
true === $gen instanceof Traversable,
// PHP 7.1
true === is_iterable($gen)
);
foreach ($gen as $char) {
echo $char, PHP_EOL;
}