quitar - php explode: divide la cadena en palabras usando un delimitador de espacio
pasar un array a string en php (6)
Aquí están los resultados de las pruebas de rendimiento:
$str = "This is a string";
var_dump(time());
for ($i=1;$i<100000;$i++){
//Alma Do Mundo - the winner
$rgData = preg_split(''//s+/'', $str);
preg_match_all(''//s+/'', $str, $rgMatches);
$rgResult = array_map(''strlen'', $rgMatches[0]);// [1,1,4]
}
print_r($rgData); print_r( $rgResult);
var_dump(time());
for ($i=1;$i<100000;$i++){
//nickb
$temp = preg_split(''/(/s+)/'', $str, -1,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$spaces = array();
$words = array_reduce( $temp, function( &$result, $item) use ( &$spaces) {
if( strlen( trim( $item)) === 0) {
$spaces[] = strlen( $item);
} else {
$result[] = $item;
}
return $result;
}, array());
}
print_r( $words); print_r( $spaces);
var_dump(time());
Int (1378392870) Array ([0] => This [1] => is [2] => a [3] => string) Array ([0] => 1 [1] => 1 [2] => 4) Int (1378392871) Array ([0] => This [1] => is [2] => a [3] => string) Array ([0] => 1 [1] => 1 [2] => 4) int (1378392873)
$str = "This is a string";
$words = explode(" ", $str);
Funciona bien, pero los espacios todavía van en la matriz:
$words === array (''This'', ''is'', ''a'', '''', '''', '''', ''string'');//true
Preferiría tener palabras solo sin espacios y mantener la información sobre el número de espacios por separado.
$words === array (''This'', ''is'', ''a'', ''string'');//true
$spaces === array(1,1,4);//true
Se acaba de agregar: (1, 1, 4)
significa un espacio después de la primera palabra, un espacio después de la segunda palabra y 4 espacios después de la tercera palabra.
¿Hay alguna manera de hacerlo rápido?
Gracias.
Aquí hay una forma, dividiendo la cadena y ejecutando una expresión regular una vez, luego analizando los resultados para ver qué segmentos fueron capturados como la división (y, por lo tanto, solo espacios en blanco), o cuáles son palabras:
$temp = preg_split(''/(/s+)/'', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$spaces = array();
$words = array_reduce( $temp, function( &$result, $item) use ( &$spaces) {
if( strlen( trim( $item)) === 0) {
$spaces[] = strlen( $item);
} else {
$result[] = $item;
}
return $result;
}, array());
Puedes ver en esta demostración que $words
es:
Array
(
[0] => This
[1] => is
[2] => a
[3] => string
)
Y $spaces
es:
Array
(
[0] => 1
[1] => 1
[2] => 4
)
Otra forma de hacerlo sería utilizando el bucle foreach.
$str = "This is a string";
$words = explode(" ", $str);
$spaces=array();
$others=array();
foreach($words as $word)
{
if($word=='' '')
{
array_push($spaces,$word);
}
else
{
array_push($others,$word);
}
}
Para dividir el String en una matriz, debe usar preg_split :
$string = ''This is a string'';
$data = preg_split(''//s+/'', $string);
Tu segunda parte (contando espacios):
$string = ''This is a string'';
preg_match_all(''//s+/'', $string, $matches);
$result = array_map(''strlen'', $matches[0]);// [1, 1, 4]
Puedes usar preg_split()
para la primera matriz:
$str = ''This is a string'';
$words = preg_split(''#/s+#'', $str);
Y preg_match_all()
para la matriz $spaces
:
preg_match_all(''#/s+#'', $str, $m);
$spaces = array_map(''strlen'', $m[0]);
$financialYear = 2015-2016;
$test = explode(''-'',$financialYear);
echo $test[0]; // 2015
echo $test[1]; // 2016