2010-01-20 16 views
5

muszę konwertować ciągi postaciJak znaleźć wszystkie podciągi z ciągu znaków w PHP

"a b c" 

do tablic postaci

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

Czy PHP świadczenia natywną funkcję do konwersji ciągów w wszystkie podciągi? Jeśli nie, jaka jest ścieżka najmniejszego oporu dla uzyskania wszystkich podciągów? Czy istnieje prosty sposób na rozbicie() struny i użycie tablicy op, aby wygenerować wszystkie [uporządkowane] permutacje?

Pozdrawiam!

Odpowiedz

13

Użycie in php tablica-is-kanałowy taśmy-of-the-świata sposób: 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

Dzięki - dokładnie to, czego szukałem! –

+1

Dodatkowo, +1 dla komentarza tablica/kanał. Tak prawdziwe. –

1

Podłoża nie są permutacjami. explode() ciąg, a następnie użyj dwóch zagnieżdżonych pętli wraz z array_slice(), aby uzyskać odpowiednie elementy.

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

?> 

Nawet jeśli nie jest to wyszukane dwa-liner do osiągnięcia tego celu, wątpię, że to bardziej wydajny i łatwy do zrozumienia (dla nikogo, aby ją zrozumieć, że prawdopodobnie trzeba patrzeć na docs. Większość ludzi prawdopodobnie uzyskać co robi substr, nawet go nie szukając).

+0

mb_strlen i mb_substr powinny być wykorzystywane do żadnych niestandardowym kodowaniu zamiast – Karsten

+1

odpowiedź Lukman jest słuszna. Nie wiedziałem, że przestrzenie są znaczące. – echo

+0

Tak, przepraszam, mogłem to bardziej wyrazić. Algorytm, który sam dostarczyłeś, jest na miejscu - dzięki za wejście! –

-4

nawet dla bardzo krótkich łańcuchów, wymóg pamięć i czas pracy eksploduje . Nawet w natywnym kodzie jest to przerażający problem z wydajnością.

Należy uzasadnić, dlaczego ta funkcja jest potrzebna, i opracować inny sposób rozwiązania problemu.

0

Można już myśleć o tablicach tej formy.

Wystarczy zaadresować zawartość za pomocą funkcji, która pobiera indeks jako parametr i zwraca odpowiednio wycięty łańcuch.

3

Minor korekta do drugiego:

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

zauważyć zmianę drugiego parametru do funkcji substr. – Spartan

0

I to pytanie nie będzie kompletna bez odpowiedzi rekurencyjnego:

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

To działa i to działa również z ciągów wielobajtowych, wszystkich metod powyżej nie zwracają wartości null i powielonych.

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")); 
Powiązane problemy