2010-01-20 15 views
5

Necesito convertir cadenas de la formaComo encontrar todas las subcadenas de una cadena en PHP

"a b c" 

en matrices de la forma

Array 
(
    [0] => a 
    [1] => a b 
    [2] => a b c 
    [3] => b 
    [4] => b c 
    [5] => c 
) 

¿El PHP proporciona una función nativa para convertir cadenas en todas las subcadenas? Si no, ¿cuál es la ruta de menor resistencia para obtener todas las subcadenas? ¿Existe alguna forma directa de tal vez explotar() la cadena y usar una matriz op para generar todas las permutaciones [ordenadas]?

¡Salud!

Respuesta

13

Uso de la en-php-array-is-la-cinta adhesiva-de-la-universo manera: P

function get_all_substrings($input, $delim = '') { 
    $arr = explode($delim, $input); 
    $out = array(); 
    for ($i = 0; $i < count($arr); $i++) { 
     for ($j = $i; $j < count($arr); $j++) { 
      $out[] = implode($delim, array_slice($arr, $i, $j - $i + 1)); 
     }  
    } 
    return $out; 
} 

$subs = get_all_substrings("a b c", " "); 
print_r($subs); 
+0

Gracias - ¡exactamente lo que estaba buscando! –

+1

Además, +1 para el comentario de la matriz/cinta adhesiva. Tan verdadero. –

1

Las subcadenas no son permutaciones. explode() la cadena, luego use dos bucles anidados junto con array_slice() para obtener los elementos relevantes.

7
<?php 
function get_all_substrings($input){ 
    $subs = array(); 
    $length = strlen($input); 
    for($i=0; $i<$length; $i++){ 
     for($j=$i; $j<$length; $j++){ 
      $subs[] = substr($input, $i, $j);    
     } 
    } 
    return $subs; 
} 

$subs = get_all_substrings("Hello world!"); 
print_r($subs); 

?> 

Incluso si hay dos revestimiento de fantasía para lograr esto, dudo que sea más eficiente o fácil de entender (para que nadie lo entiende que probablemente tendría que mirar los documentos. La mayoría de la gente probablemente reciben lo que substr hace sin siquiera buscarlo).

+0

mb_strlen y mb_substr debe usarse para cualquier codificación no estándar en lugar – Karsten

+1

respuesta de Lukman es correcto. No me di cuenta de que los espacios eran importantes. – echo

+0

Sí, lo siento, podría haberlo hecho más explícito. Sin embargo, el algoritmo que proporcionó es perfecto, ¡gracias por la entrada! –

-4

Para cadenas incluso bastante corto, el requisito de memoria y tiempo de ejecución va a explotar . Incluso en el código nativo, este es un problema de rendimiento aterrador.

Justifique por qué necesita esta función y resuelva el problema de otra forma.

0

Ya se pueden pensar en arreglos de esa forma.

Simplemente dirija el contenido con una función que toma el índice como parámetro y devuelve la cadena cortada apropiadamente.

3

pequeña corrección a la segunda:

<?php 
function get_all_substrings($input){ 
$subs = array(); 
$length = strlen($input); 
for($i=0; $i<$length; $i++){ 
    for($j=$i; $j<$length; $j++){ 
     $subs[] = substr($input, $i, ($j - $i) + 1);  
    } 
} 
return $subs; 
} 

$subs = get_all_substrings("abc"); 
print_r($subs); 

?> 
+0

observe el cambio en el segundo parámetro a la función substr. – Spartan

0

Y esta pregunta no será completa sin la respuesta recursiva:

function get_substrings($str){ 
    $len = strlen($str); 
    $ans = array(); 
    $rest = array(); 
    for ($i = 1; $i <= $len; $i++) {     
     $ans[] = substr($str, 0, $i);   
    } 
    if($str){ 
     $rest = get_substrings(substr($str, 1)); 
    } 
    return array_merge($ans, $rest); 
} 

$subs = get_substrings("abc"); 
print_r($subs); 
0

Esto funciona y funciona también con cadenas multibyte, todos los métodos arriba no, devuelven valores nulos y duplicados.

function substrings($str, $charset = 'UTF-8') { 
    $length = mb_strlen($str, $charset); 

    $subs = []; 
    for ($i = 0; $i < $length; $i++) 
    for ($j = 1; $j <= $length; $j++) 
     $subs[] = mb_substr($str, $i, $j, $charset); 

    return array_unique($subs); 
} 

print_r(substrings("php")); 
Cuestiones relacionadas