ultimos - tomar primer caracter de una cadena php
Convierta una cadena en una matriz en diferentes ocurrencias de caracteres (2)
Regex: (.)/1{1,}
(.)
: Unir y capturar un solo personaje.
/1
: Esto contendrá el primer partido
/1{1,}
: utilizar el carácter coincidente una o más veces.
<?php
ini_set("display_errors", 1);
$string="aaaabbbaaaaaabbbb";
preg_match_all(''/(.)/1{1,}/'', $string,$matches);
print_r($matches);
Salida:
Array
(
[0] => Array
(
[0] => aaaa
[1] => bbb
[2] => aaaaaa
[3] => bbbb
)
[1] => Array
(
[0] => a
[1] => b
[2] => a
[3] => b
)
)
O:
<?php
$string="aaaabbbaaaaaabbbb";
$array=str_split($string);
$start=0;
$end= strlen($string);
$indexValue=$array[0];
$result=array();
$resultantArray=array();
while($start!=$end)
{
if($indexValue==$array[$start])
{
$result[]=$array[$start];
}
else
{
$resultantArray[]=implode("", $result);
$result=array();
$result[]=$indexValue=$array[$start];
}
$start++;
}
$resultantArray[]=implode("", $result);
print_r($resultantArray);
Salida:
Array
(
[0] => aaaa
[1] => bbb
[2] => aaaaaa
[3] => bbbb
)
Considere que tengo esta cadena ''aaaabbbaaaaaabbbb''
Quiero convertir esto en matriz para que obtenga el siguiente resultado
$array = [
''aaaa'',
''bbb'',
''aaaaaa'',
''bbbb''
]
¿Cómo hacer esto en PHP?
He escrito una línea con solo preg_split () que genera el resultado esperado sin memoria desperdiciada (sin saturación de matriz):
Código ( Demo ):
$string=''aaaabbbaaaaaabbbb'';
var_export(preg_split(''/(.)/1*/K/'',$string,NULL,PREG_SPLIT_NO_EMPTY));
Salida:
array (
0 => ''aaaa'',
1 => ''bbb'',
2 => ''aaaaaa'',
3 => ''bbbb'',
)
Patrón:
(.) #match any single character
/1* #match the same character zero or more times
/K #keep what is matched so far out of the overall regex match
La verdadera magia ocurre con la /K
, para leer más ir aquí . El parámetro NULL
en preg_split()
significa "coincidencias ilimitadas". Este es el comportamiento predeterminado, pero necesita mantener su lugar en la función para que el siguiente parámetro se use apropiadamente como flag
El parámetro final es PREG_SPLIT_NO_EMPTY
que elimina las coincidencias vacías.
El método preg_match_all () de Sahil preg_match_all(''/(.)/1{1,}/'', $string,$matches);
es un buen intento, pero no es perfecto por dos razones:
El primer problema es que su uso de preg_match_all()
devuelve dos subcampos que duplican el resultado necesario.
El segundo problema se revela cuando $string="abbbaaaaaabbbb";
. Su método ignorará al primer personaje solitario. Aquí está su resultado:
Array (
[0] => Array
(
[0] => bbb
[1] => aaaaaa
[2] => bbbb
)
[1] => Array
(
[0] => b
[1] => a
[2] => b
)
)
El segundo intento de Sahil produce la salida correcta, pero requiere mucho más código. Una solución no regex más concisa podría verse así:
$array=str_split($string);
$last="";
foreach($array as $v){
if(!$last || strpos($last,$v)!==false){
$last.=$v;
}else{
$result[]=$last;
$last=$v;
}
}
$result[]=$last;
var_export($result);