una ultimos tomar primer parte extraer eliminar dividir caracteres caracter cadena buscar php arrays split duplicates

ultimos - tomar primer caracter de una cadena php



Convierta una cadena en una matriz en diferentes ocurrencias de caracteres (2)

Demo de código PHP

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:

Demo de código PHP

<?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);