2010-01-20 5 views
5

J'ai besoin de convertir des chaînes de la formeComment trouver tous les sous-chaînes d'une chaîne en PHP

"a b c" 

dans des tableaux de la forme

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

Est-ce que PHP fournit une fonction native pour convertir les chaînes en toutes les sous-chaînes? Si non, quel est le chemin de moindre résistance pour obtenir toutes les sous-chaînes? Existe-t-il un moyen simple de faire exploser() la chaîne, et utiliser un tableau op pour générer toutes les permutations [ordonnées]?

À la votre!

Répondre

13

Utilisation du en php-tableau-est-la bande de--gaine l'univers chemin: 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

Merci - exactement ce que je cherchais! –

+1

De même, +1 pour le commentaire sur la bande/conduit. Tellement vrai. –

1

Les sous-chaînes ne sont pas des permutations. explode() la chaîne, puis utilisez deux boucles imbriquées avec array_slice() pour obtenir les éléments pertinents.

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

?> 

Même s'il y a un deux doublure fantaisie pour ce faire, je doute qu'il est plus efficace ou facile à comprendre (pour tout le monde pour le comprendre qu'ils avaient probablement à regarder les documents. La plupart des gens obtiennent probablement ce que substr fait sans même le chercher).

+0

mb_strlen et mb_substr doit être utilisé pour tout codage non standard à la place – Karsten

+1

la réponse de Lukman est juste. Je n'ai pas réalisé que les espaces étaient significatifs. – echo

+0

Ouais - désolé, je l'aurais peut-être rendu plus explicite. L'algorithme que vous avez fourni est bien sur - merci pour l'entrée! –

-4

Pour encore des chaînes assez courtes, l'exigence de mémoire et d'exécution va exploser . Même en code natif, c'est un problème de performance effrayant. Justifiez pourquoi vous avez besoin de cette fonction et trouvez une autre solution au problème.

0

On peut déjà penser à des tableaux de cette forme.

Il suffit d'adresser le contenu avec une fonction qui prend l'index comme paramètre et renvoie la chaîne coupée de manière appropriée.

3

Correction mineure à la seconde:

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

notez la modification du second paramètre à la fonction substr. – Spartan

0

Et cette question ne sera pas complète sans la réponse récursive:

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

Cela fonctionne et il fonctionne également avec des chaînes multi-octets, toutes les méthodes ci-dessus ne le font pas, ils renvoient des valeurs nulles et dupliquées.

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")); 
Questions connexes