2010-01-20 12 views
5

Ich brauche Saiten der FormWie alle Teil einer Zeichenfolge in PHP finden

"a b c" 

in Arrays der Form

eine native Funktion konvertieren für Strings in
Array 
(
    [0] => a 
    [1] => a b 
    [2] => a b c 
    [3] => b 
    [4] => b c 
    [5] => c 
) 

Does PHP bieten Umwandlung alle Teilstrings? Wenn nicht, was ist der Weg des geringsten Widerstandes, um alle Teilstrings zu erhalten? Gibt es eine direkte Möglichkeit, die Zeichenfolge zu explodieren() und ein Array-Op zu verwenden, um alle [geordneten] Permutationen zu generieren?

Prost!

Antwort

13

Mit dem in-PHP-Array-is-the-Kanal-Band-of-the-Universum Weg: 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

Danke - genau das, was ich gesucht habe! –

+1

Auch +1 für den Array/Klebeband-Kommentar. So wahr. –

1

Teilstrings sind keine Permutationen. explode() die Zeichenfolge, dann verwenden Sie zwei verschachtelte Schleifen zusammen mit array_slice(), um die relevanten Elemente zu erhalten.

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

?> 

Auch wenn es eine Phantasie Zweizeiler dies zu tun, ich bezweifle es ist nicht mehr effizient oder leicht zu verstehen (für alle, es zu verstehen, würden sie wahrscheinlich in der Dokumentation suchen. Wahrscheinlich die meisten Leute bekommen was substr macht, ohne auch nur nachzuschauen).

+0

mb_strlen und mb_substr sollte für alle Nicht-Standard-Codierung stattdessen verwendet werden – Karsten

+1

Lukmans Antwort ist richtig. Ich wusste nicht, dass die Räume von Bedeutung waren. – echo

+0

Ja - Entschuldigung, das hätte ich vielleicht deutlicher gemacht. Der von Ihnen zur Verfügung gestellte Algorithmus ist jedoch genau richtig - danke für die Eingabe! –

-4

Für eine noch recht kurze Strings, wird der Speicher- und Laufzeitbedarf explodiert . Selbst im nativen Code ist dies ein unheimliches Leistungsproblem.

Begründen Sie, warum Sie diese Funktion benötigen und versuchen Sie, das Problem anders zu lösen.

0

Sie können bereits an Arrays dieser Form gedacht werden.

Adressieren Sie den Inhalt einfach mit einer Funktion, die den Index als Parameter akzeptiert und die Zeichenfolge in geeigneter Weise zurückgibt.

3

Minor Korrektur zum zweiten:

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

Beachten Sie die Änderung des zweiten Parameters in der Funktion substr. – Spartan

0

Und diese Frage wird ohne die rekursive Antwort nicht vollständig sein:

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

Dies funktioniert und es funktioniert auch mit Multibyte-Strings, alle Methoden darüber hinaus geben sie null und doppelte Werte zurück.

Verwandte Themen